我怎样才能检测是否调用方传递任何变量我在Python的功能?
题
我猜题目听起来很愚蠢,所以我将展示一些代码:
def foo(**kwargs):
# How can you detect the difference between (**{}) and ()?
pass
foo(**{})
foo()
是否有任何方式内检测foo,那么方法如何被调用的?
更新1
由于有一些意见,为什么你可能想要做的事,我会尽力解释一些背景。
super(MyClass, self).foo(*args, **kwargs)
吮吸 - 很多重复浪费的。我想写“self.super()”。在这种情况下,只需要调用父类,交出所有参数调用的方法得到了为好。就像一个魅力。
现在有问题的魔部分:
我想说“self.super(东西)”,在这种情况下,只有“东西”被传递给超方法。适用于大多数情况。
这是其中它打破:
def foo(self, fnord=42, *args, **kwargs):
self.super(*args, **kwargs)
所以超级方法应该得到的参数调用的方法 - 但是如果*args
,**kwargs
都是空的,目前该库无法检测这种情况,并通过了所有的参数,包括“fnord” ......
当然,我可以使用self.super.foo(*args, **kwargs)
作为一种替代的语法,但其的跛脚: - )
PS:是的,我知道P3K的超级,但仍然不是很好,它不与Python 2.x的...
工作更新2
其实即使Python的AST模块去掉**{}
(ast.parse('foo(**{})')
),所以它看起来像这种情况这么早的解析过程,你以后就不能得到...
所以,最后我要么放弃该特定问题(引发一个AmbiguousSyntaxError),或使用文本解析提议〜unutbu。重新思考我的做法,后者实际上可能feasable因为我只需要知道它是self.super(\s*)
,self.super(\S+)
。
解决方案
此劈只适用于CPython的。
import traceback
def foo(**kwargs):
# stack is a list of 4-tuples: (filename, line number, function name, text)
# see http://docs.python.org/library/traceback.html#module-traceback
(filename,line_number,function_name,text)=traceback.extract_stack()[-2]
print('foo was called: %s'%text)
foo(**{})
# foo was called: foo(**{})
foo()
# foo was called: foo()
作为如何,这可能是有用的示例:
def pv(var):
(filename,line_number,function_name,text)=traceback.extract_stack()[-2]
print('%s: %s'%(text[text.find('(')+1:-1],var))
x=5
pv(x)
# x: 5
注意pv
调用与刚刚值x
,但
它打印变量的两个“名称”(因为它是所谓),和可变的值。有时我调试时使用这个和我懒得写了完整的打印语句。
其他提示
在你更新你原来的问题你写你想能够做这样的事:
def foo(self, fnord=42, *args, **kwargs):
self.super(*args, **kwargs)
这是不是你想要做什么?
def foo(self, fnord=42, *args, **kwargs):
self.super(fnord=fnord, *args, **kwargs)
因此,基本上是不可能做到这一点与所提供的Python模块。我不得不回退,其工作对我来说非常好给出我的要求简单的纯文本的正则表达式。