gpt4 book ai didi

python - 计算有多少参数作为位置传递

转载 作者:行者123 更新时间:2023-12-04 04:28:05 27 4
gpt4 key购买 nike

如果我有一个功能

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

我意识到我最初没有指定这一点,但是可以在保留类型注释的同时做到这一点吗?到目前为止的最佳答案建议使用装饰器 - 但是,这不会保留返回类型

最佳答案

您可以创建一个装饰器,如下所示:

def checkargs(func):
def inner(*args, **kwargs):
if 'y' in kwargs:
print('y passed with its keyword!')
else:
print('y passed positionally.')
result = func(*args, **kwargs)
return result
return inner

>>> @checkargs
...: def foo(x, y):
...: return x + y

>>> foo(2, 3)
y passed positionally.
5

>>> foo(2, y=3)
y passed with its keyword!
5
当然,您可以通过允许装饰器接受参数来改进这一点。因此,您可以传递要检查的参数。这将是这样的:
def checkargs(param_to_check):
def inner(func):
def wrapper(*args, **kwargs):
if param_to_check in kwargs:
print('y passed with its keyword!')
else:
print('y passed positionally.')
result = func(*args, **kwargs)
return result
return wrapper
return inner

>>> @checkargs(param_to_check='y')
...: def foo(x, y):
...: return x + y

>>> foo(2, y=3)
y passed with its keyword!
5
我想添加 functools.wraps 将保留注释,以下版本还允许对所有参数执行检查(使用 inspect ):
from functools import wraps
import inspect

def checkargs(func):
@wraps(func)
def inner(*args, **kwargs):
for param in inspect.signature(func).parameters:
if param in kwargs:
print(param, 'passed with its keyword!')
else:
print(param, 'passed positionally.')
result = func(*args, **kwargs)
return result
return inner

>>> @checkargs
...: def foo(x, y, z) -> int:
...: return x + y

>>> foo(2, 3, z=4)
x passed positionally.
y passed positionally.
z passed with its keyword!
9

>>> inspect.getfullargspec(foo)
FullArgSpec(args=[], varargs='args', varkw='kwargs', defaults=None,
kwonlyargs=[], kwonlydefaults=None, annotations={'return': <class 'int'>})
_____________HERE____________

关于python - 计算有多少参数作为位置传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67639234/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com