检查参数是通过位置传递还是通过关键字传递

lee*_*ezu 14 python python-3.x

考虑带有签名的功能f(a, b)。将来,我想将签名更改为f(a, *, b),不允许b作为位置参数传递。为了减少更改的影响,我想首先弃用指定的b位置,警告用户这样做。

为此,我想写一些类似的东西:

def f(a, b):
    frame = inspect.currentframe()
    if b in frame.specified_as_positional:
        print('Do not do that')
    else:
        print('Good')
Run Code Online (Sandbox Code Playgroud)

结果将是

>>> f(1, 2)
'Do not do that'
>>> f(1, b=2)
'Good'
Run Code Online (Sandbox Code Playgroud)

inspect.getargvalues(frame)似乎还不够。ArgInfo对象仅提供

>>> f(1,b=2)
ArgInfo(args=['a', 'b'], varargs=None, keywords=None, locals={'a': 1, 'b': 2})
Run Code Online (Sandbox Code Playgroud)

这样的检查在Python中甚至可能吗?从概念上讲,似乎不需要记住解释器是在位置指定还是作为关键字指定参数。

Python 2支持会很不错,但不是严格要求的。

小智 4

这是一个非常hacky的解决方案:

def f(a, c=None, b=None):
    if c is not None:
        print("do not do that")
    else:
        print("good")
Run Code Online (Sandbox Code Playgroud)

f(1, b=2)输入打印goodf(1, 2)打印的地方do not do that