当前位置: 首页 > 面试题库 >

Python-有人拥有可以处理不可散列参数的备注修饰符吗?

程树
2023-03-14
问题内容

我一直在使用以下记忆修饰符(来自很棒的书Python Algorithms:掌握Python语言中的基本算法…喜欢它,顺便说一句)。

def memo(func):
    cache = {}
    @ wraps(func)
    def wrap(*args):
        if args not in cache:
            cache[args] = func(*args)
        return cache[args]
    return wrap

这个装饰器的问题是基于字典的缓存意味着我所有的参数都必须是可哈希的。

有没有人有一个允许使用不可散列参数(例如字典)的实现(或对此进行了调整)?

我知道缺少哈希值意味着存在“这是在缓存中吗?”的问题。变得微不足道,但我只是想问一下。

===编辑以提供上下文===

我正在研究一个函数,该函数在给定模块字典的情况下返回Parnas样式的“使用层次”:依赖项。设置如下:

def uses_hierarchy(requirements):
    """
    uses_hierarchy(requirements)

    Arguments:
    requirements - a dictionary of the form {mod: list of dependencies, }

    Return value:
    A dictionary of the form {level: list of mods, ...}

    Assumptions:
    - No cyclical requirements (e.g. if a requires b, b cannot require a).
    - Any dependency not listed as a mod assumed to be level 0.

    """

    levels = dict([(mod, _level(mod, requirements))
                   for mod in requirements.iterkeys()])
    reversed = dict([(value, []) for value in levels.itervalues()])
    for k, v in levels.iteritems():
        reversed[v].append(k)
    return reversed


def _level(mod, requirements):
    if not requirements.has_key(mod):
        return 0
    dependencies = requirements[mod]
    if not dependencies:
        return 0
    else:
        return max([_level(dependency, requirements)
                    for dependency in dependencies]) + 1

以便:

>>> requirements = {'a': [],
...                 'b': [],
...                 'c': ['a'],
...                 'd': ['a','b'],
...                 'e': ['c','d'],
...                 'f': ['e']
...                 }

>>> uses_hierarchy(requirements)
{0: ['a', 'b'], 1: ['c', 'd'], 2: ['e'], 3: ['f']}

_level是我要记住的功能,以使此设置更具可伸缩性。在没有备忘录的情况下实现时,它将多次计算依赖级别(例如,我在上面的示例中认为“ a”被计算了8次)。

谢谢,

麦克风


问题答案:

这是Alex Martelli Python Cookbook中的示例,展示了如何使用cPickle为带有可变参数(
原始版本 )的函数创建备忘录装饰器:

import cPickle

class MemoizeMutable:
    def __init__(self, fn):
        self.fn = fn
        self.memo = {}
    def __call__(self, *args, **kwds):
        import cPickle
        str = cPickle.dumps(args, 1)+cPickle.dumps(kwds, 1)
        if not self.memo.has_key(str): 
            print "miss"  # DEBUG INFO
            self.memo[str] = self.fn(*args, **kwds)
        else:
            print "hit"  # DEBUG INFO

        return self.memo[str]

这是一个链接。

编辑: 使用您给定的代码和此备忘录装饰器:

_level = MemoizeMutable(_level)

equirements = {'a': [],
               'b': [],
               'c': ['a'],
               'd': ['a','b'],
               'e': ['c','d'],
               'f': ['e']
                 }

print uses_hierarchy(equirements)

我能够重现此:

miss
miss
hit
miss
miss
hit
miss
hit
hit
hit
miss
hit
{0: ['a', 'b'], 1: ['c', 'd'], 2: ['e'], 3: ['f']}


 类似资料:
  • 我目前在一个项目中处理Java的自定义注释。我想强制注释的用户,如果他用@Foo注释了方法,他必须在方法参数列表中声明至少一个。所以它应该是这样的: 使用注释处理器,我可以检索变量的类型,但不能检索最终的修饰符。如果我想检索下面代码中所示的修改器集,那么该集将始终为空,尽管最后一个修改器出现在参数上。 有什么想法,为什么会这样?

  • 问题内容: 抱歉,这是一个非常广泛的问题。 以下代码是网络上某些内容的片段。我感兴趣的关键是从@protected开始的行- 我想知道这是做什么的以及它是如何做到的?在执行do_upload_ajax函数之前,似乎正在检查是否已登录有效用户。这似乎是进行用户身份验证的一种非常有效的方法。我不了解此@函数的机制- 有人可以引导我正确的方向来解释如何在现实世界中实现它吗?Python 3请回答。谢谢。

  • private private修饰符是我们使用的最限制的修饰符。它表示它只能被自己所在的文件可见。所以如果我们给一个类声明为private,我们就不能在定义这个类之外的文件中使用它。 另一方面,如果我们在一个类里面使用了private修饰符,那访问权限就被限制在这个类里面了。甚至是继承这个类的子类也不能使用它。 所以一等公民,类、对象、接口……(也就是包成员)如果被定义为private,那么它们只

  • 问题内容: 我希望它能够仅使用lira_cbt作为参数(执行x),或者同时使用lira_cbt和eur_hedge(执行y)运行。可以使用sys.argv实现吗? 问题答案: 只需使用长度

  • Kotlin中这些修饰符是与我们Java中的使用是有些不同的。在这个语言中默认的修饰符是public,这节约了很多的时间和字符。但是这里有一个详细的解释关于在Kotlin中不同的可见性修饰符是怎么工作的。

  • 问题内容: 是否可以直接声明Flask URL可选参数? 目前,我正在按照以下方式进行: 我如何直接说这是可选的? 问题答案: 另一种方法是写 但是我想你想编写一条路由并将其标记为可选?如果是这样,我认为不可能。