0

抱歉,问题标题有点晦涩。

本质上,我需要执行以下操作。

我在 Python 中有一个函数,例如:

@Wrapper
def auselessfunction(dictionary):
    dictionary["foo"] = 3
    dictionary["bar"] = 5

然后我有一个装饰器对象,它将函数作为输入,例如

class Wrapper:
    def __init__(self,function):
        self.function = function
    def __call__(self,*args):
        self.function(*args)

我需要一种方法来在装饰器的init方法中确定函数使用的字典的键是什么。

有没有办法做到这一点?我一直在研究函数自省,可以使用以下方法找到键本身:

function.__code__.co_consts

但这给出了函数体中使用的所有常量,这可能很危险。

提前致谢。

编辑:

感谢您的快速响应。我可以理解我的具体问题有点模糊。简单来说,我想做的是创建一个装饰器,给定一个从字典中访问某些键的函数,然后可以找到/计算这些特定键的值。例如,如果字典表示二维列表中的位置,dictionary[0,0] 将表示当前索引,dictionary[0,1] 表示其正下方的索引,依此类推。我想知道是否有一种方法可以访问这些键,而无需直接访问 2D 列表中的实际位置。我不知道这是否使它更清楚...

例如,鉴于:

board =
[0,1,2,3,4,5],
[5,4,3,2,1,0],
[0,1,2,3,4,5],
[5,4,3,2,1,0],
[0,1,2,3,4,5],
[5,4,3,2,1,0]

dictionary[0,0] refers to 0,1,2,3,4,5,5,4.... successively, and
dictionary[0,1] refers to 5,4,3,2,1,0,0,1.... (the elements directly underneath)

为此,我正在尝试创建一个解决这些位置的装饰器,但我只想解决实际使用的位置,从而解决问题。

编辑:(@aya)

我很想提供更具体的代码,但这是在不知道我原来问题的答案的情况下尽可能接近的。理想情况下,我想要一个解决方案,每次访问字典时都将传递的对象作为键保存。问题是我想在调用字典访问方法之前知道。我能想到的最接近的事情是搜索函数返回的代码对象,以使用正则表达式或类似的涉及代码对象的字典访问调用。很抱歉,我没有比这更有帮助的了。

4

1 回答 1

0

我不知道你的问题是什么,但我不确定你的解决方案是最好的。

据我所知,您至少需要访问函数 ( function.__code__) 的代码并对其进行反编译。即便如此,也不会那么容易……

截至目前__code__.co_consts,它只是一个包含函数源代码中使用的静态值的“段”。正如您所注意到的,仅检查它就会触发误报。另一方面,如果键是“非常量”(变量、参数或以其他方式获得),您将无法检测到对字典的访问。

最后,更不用说您的代码将变得(非常)依赖于实现。


如您所见,这里有很多储备。作为建议,不要询问您尝试的解决方案,而应该发布其他问题来提及您的需求,以获得其他更强大的解决方案。例如,您可以使用字典的自定义类,而不是将您的函数包装在装饰器中,它的行为类似于字典,但如果您想阻止访问某些键,则可以使用某种“记录”或“检查”活动. 再一次,如果不知道真正的问题是什么,就很难说清楚。

于 2013-06-26T06:45:12.950 回答