[英]In python is there any way I can obtain the arguments passed to a function as object?
[英]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内部,如何调用该方法?
因为有一些评论为什么您可能想做点什么,所以我将尝试解释一些背景知识。
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。
实际上,即使是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.