【发布时间】:2021-08-10 19:41:41
【问题描述】:
如果我有一个功能
def foo(x, y):
pass
如何从函数内部判断 y 是按位置传递还是通过其关键字传递的?
我想要类似的东西
def foo(x, y):
if passed_positionally(y):
print('y was passed positionally!')
else:
print('y was passed with its keyword')
让我得到
>>> foo(3, 4)
y was passed positionally
>>> foo(3, y=4)
y was passed with its keyword
我意识到我最初并没有指定这一点,但是否可以在保留类型注释的同时做到这一点?到目前为止,最佳答案建议使用装饰器 - 但是,它不会保留返回类型
【问题讨论】:
-
有趣的问题,但是这样的功能的用例是什么?为什么函数会根据参数的传递方式对参数进行不同的处理?
-
使这成为可能将允许函数的不同行为,无论您使用
f(a, b)还是使用f(x=a, y=b)调用它,都打破了python 函数def 假定的“合同”:但是你调用它,如果参数是相同的,函数应该对 args 应用相同的操作。 -
您的标题似乎与问题不符。标题询问位置参数的数量。这与确定
y是按位置传递还是通过关键字传递有什么关系? -
也许你真正想要的是
def foo(*x, y=None):? -
实际需要为库发出弃用警告
标签: python function parameter-passing