我怎样才能检测是否调用方传递任何变量我在Python的功能?

StackOverflow https://stackoverflow.com/questions/2529491

  •  22-09-2019
  •  | 
  •  

我猜题目听起来很愚蠢,所以我将展示一些代码:

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模块。我不得不回退,其工作对我来说非常好给出我的要求简单的纯文本的正则表达式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top