我想这个主题听起来很愚蠢,所以我将展示一些代码:
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)
其用作替代语法,但这很蹩脚:-)
PS:是的,我知道 p3k 的超级,但仍然不是很好,它不适用于 Python 2.x...
更新 2
实际上,即使 Python 的 ast 模块也删除了**{}
( ast.parse('foo(**{})')
),所以看起来这种情况发生在解析过程的早期,以至于您以后无法获得此信息......
所以最后我要么放弃那个特定的问题(引发 AmbiguousSyntaxError),要么使用 ~unutbu 提出的文本解析。重新考虑我的方法,后者实际上可能是可行的,因为我只需要知道它是否是self.super(\s*)
, self.super(\S+)
.