对于略显晦涩的问题标题感到抱歉。
本质上,我需要做以下几点。
我在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
但这会给出函数体中使用的所有常量,这可能很危险。
提前致谢。
编辑:
感谢您的快速反应。我可以理解我的具体问题有点模糊。简单来说,我想要做的是创建一个装饰器,给定一个从字典访问某些键的功能,然后可以查找/计算这些特定键的值。例如,如果字典表示2D列表中的位置,则字典[0,0]将表示当前索引,字典[0,1]表示其正下方的索引,依此类推。我想知道是否有一种方法可以让函数访问这些键而无需直接访问2D列表中的实际位置。我不知道这是否更清楚......
E.g。鉴于:
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)
要做到这一点,我正在尝试创建一个解析这些位置的装饰器,但我只想解决实际使用的位置,从而解决问题。
编辑:(@ aaya)
我很想提供更具体的代码,但是如果不知道原始问题的答案,我就能得到尽可能接近的代码。理想情况下,我想要一个解决方案,每次访问字典时都会保存作为键传递的对象。问题是我想在调用字典访问方法之前知道。我能想到的最接近的事情是使用正则表达式搜索函数返回的代码对象以及涉及代码对象的类似内容。对不起,我不能比这更有帮助。
答案 0 :(得分:0)
我不知道你的问题是什么,但我不确定你的解决方案是最好的。
据我所知,您至少需要访问函数代码(function.__code__
)并对其进行反编译。即便如此,它也不会那么容易......
从__code__.co_consts
开始,它只是一个包含函数源代码中使用的静态值的“段”。正如您所注意到的那样,检查它会引发误报。另一方面,如果密钥“不稳定”(变量,参数或以其他方式获得),您将无法检测对字典的访问。
最后,没有提及您的代码将变得(非常)依赖于实现。
如你所见,这里有很多储备。作为建议,您应该发布其他问题,提及需要,而不是询问您尝试过的解决方案,以获取其他问题 - 更强大 - 解决方案。作为一个例子,您可以使用自定义类进行装饰器,而不是将您的函数包装在装饰器中,它可以像字典一样使用,但如果您想要阻止访问某些键,可以使用某种“日志记录”或“检查”活动。再一次,在不知道真正的问题是什么的情况下很难说清楚。