赋予以下功能:
def foo(a, b, c):
pass
一个人如何获得传入的参数的列表/元组/ dict / etc,而不必自己构建结构?
具体来说,我在寻找Python版本的JavaScriptarguments
关键字或PHPfunc_get_args()
方法。
我不需要的是使用*args
or的解决方案**kwargs
。我需要在函数定义中指定参数名称(以确保将其传递),但是在函数中,我想以列表或dict样式的结构使用它们。
赋予以下功能:
def foo(a, b, c):
pass
一个人如何获得传入的参数的列表/元组/ dict / etc,而不必自己构建结构?
具体来说,我在寻找Python版本的JavaScriptarguments
关键字或PHPfunc_get_args()
方法。
我不需要的是使用*args
or的解决方案**kwargs
。我需要在函数定义中指定参数名称(以确保将其传递),但是在函数中,我想以列表或dict样式的结构使用它们。
Answers:
您可以locals()
用来获取函数中局部变量的字典,如下所示:
def foo(a, b, c):
print locals()
>>> foo(1, 2, 3)
{'a': 1, 'c': 3, 'b': 2}
但是,这有点骇人听闻,因为它会locals()
返回本地范围内的所有变量,而不仅是传递给函数的参数,因此,如果不在函数的顶部调用它,结果可能会包含比所需更多的信息。 :
def foo(a, b, c):
x = 4
y = 5
print locals()
>>> foo(1, 2, 3)
{'y': 5, 'x': 4, 'c': 3, 'b': 2, 'a': 1}
如其他答案中所建议的那样,我宁愿在函数顶部构造一个字典或所需变量的列表。它更加明确,以更清晰的方式传达您的代码意图,恕我直言。
locals()
在函数定义之后直接使用它,否则它将包含函数内定义的所有变量。
locals()
返回局部变量的快照,而不是指向某些内置字典的指针。因此,如果稍后定义变量或在函数中更改参数,locals()
则分配给它的任何内容都不会更改。这就是你想要的。(I💜Python。)
如果参数不符合预期,我会使用*args
或**kwargs
引发异常
如果您想要与python检查的错误相同的错误,可以执行类似的操作
def check_arguments(function_name,args,arg_names):
missing_count = len(arg_names) - len(args)
if missing_count > 0:
if missing_count == 1:
raise TypeError(function_name+"() missing 1 required positionnal argument: "+repr(arg_names[-1]))
else:
raise TypeError(function_name+"() missing "+str(missing_count)+" required positionnal argument: "+", ".join([repr(name) for name in arg_names][-missing_count:-1])+ " and "+repr(arg_names[-1]))
与某物一起使用
def f(*args):
check_arguments("f",args,["a","b","c"])
#whatever you want
...
从一个重复的问题(较旧的问题?)中接受的答案https://stackoverflow.com/a/582206/1136458:
frame = inspect.currentframe()
args, _, _, values = inspect.getargvalues(frame)
这里是一种使用装饰器的解决方案。
您已在标题中指定参数了吗?
您为什么不在体内简单地使用相同的信息?
def foo(a, b, c):
params = [a, b, c]
我错过了什么?
arguments
或PHP不太相似func_get_args()
。
log_methods_arguments
示例可以使用*args, **kwargs
参数。OP指出必须指定确切的参数。此代码气味的动机尚不清楚。
您可以使用以下方法从其中创建一个列表:
args = [a,b,c]
您可以使用以下方法轻松地从中创建一个元组:
args =(a,b,c)
arguments
或PHP不太相似func_get_args()
。
class my_class():
compulsory_default_kwargs = {'p':20,'q':30,'r':40}
formal_args_names = ['var1','var2']
def __init__(self,*args,**kwargs):
for key , value in locals().items():
if((key == 'args')):
if(len(args) == len(my_class.formal_args_names)):
for key_name , arg_value in zip(my_class.formal_args_names,args):
setattr(self,key_name,arg_value)
else:
raise Exception ('Error - Number of formal arguments passed mismatched required {} whereas passed {}'.format(len(my_class.formal_args_names),len(args)))
elif((key == 'kwargs') & (len(kwargs)!=0)):
for kw_key , kw_value in kwargs.items():
if kw_key in my_class.compulsory_default_kwargs.keys():
setattr(self,kw_key,kw_value)
else:
raise Exception ('Invalid key-word argument passed {}'.format(kw_key))
#elif((key!='self') & (key!='kwargs') ):
# setattr(self,key,value)
for key , value in my_class.compulsory_default_kwargs.items():
if key not in kwargs.keys():
setattr(self,key,value)
this_value = 'Foo'
my_cl = my_class(3,this_value,p='B',r=10)
my_cl.__dict__