繁体   English   中英

如何检测调用者是否在Python中将任何变量传递给了我的函数?

[英]How can I detect if the caller passed any variables to my function in 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(something)”,在这种情况下,仅将“ something”传递给super方法。 适用于大多数情况。

这是它打破的地方:

def foo(self, fnord=42, *args, **kwargs):
    self.super(*args, **kwargs)

因此,超级方法应该获取调用方法的参数-但是,如果*args**kwargs为空,则当前库无法检测到这种情况,并传递了包括“ fnord”在内的所有参数。

当然,我可以使用self.super.foo(*args, **kwargs)作为替代语法,但这很self.super.foo(*args, **kwargs) :-)

PS:是的,我知道p3k超级好,但仍然不是很好,它不适用于Python2.x。

更新2

实际上,即使是Python的ast模块也删除了**{}ast.parse('foo(**{})') ),因此看起来这种情况发生在解析过程的早期,您以后再也无法获取此信息。 。

因此,最后我要么放弃这个特定的问题(引发AmbiguousSyntaxError),要么使用〜unutbu提出的文本解析。 重新考虑我的方法,后者实际上可能是可行的,因为我只需要知道它是否为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调用,但它同时打印变量(被称为)的“名称”和变量的值。 有时我在调试时会用到它,并且懒得写出完整的print语句。

在您对原始问题的更新中,您写的是希望能够执行以下操作:

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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM