pythondef元组参数传递_关于python:获取传递给函数的参数的列表/元组/字典?

鉴于以下功能:

def foo(a, b, c):

pass

如何获得传入的参数的list / tuple / dict / etc,而不必自己构建结构?

具体来说,我正在寻找Python的arguments关键字或PHP的func_get_args()方法的Python版本。

我不想要的是使用*args或**kwargs的解决方案; 我需要在函数定义中指定参数名称(以确保它们被传入),但在函数中我希望在list-或dict-style结构中使用它们。

请不要这样做。 通过使用非常好的关键字参数创建无用的字典,维护代码的人将会非常困惑。 他们将被迫重写以删除字典。

python中获取方法参数名称的可能重复

@blahdiblah这个问题是询问如何获取参数本身,而不是参数的名称。 我不认为这是重复的。

@ S.Lott:这是一个相当狭隘的观点。 有时候想要在函数内部构建一个字典,用一些强制参数初始化。 函数参数列表清楚地说明了它们是什么,相信我,它们不一定是"无用的"。 请参考Python的DRY原则,并不像我曾与之合作过的一些初级开发者,他们会抱怨"为什么有人想这么做?" 当我建议他们的API可以更通用。

您可以使用locals()来获取函数中局部变量的字典,如下所示:

def foo(a, b, c):

print locals()

>>> foo(1, 2, 3)

{'a': 1, 'c': 3, 'b': 2}

但是,这有点hackish,因为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}

我宁愿在你的函数顶部构建一个dict或变量列表,如其他答案所示。它更明确,并以更清晰的方式传达代码的意图,恕我直言。

谢谢。对于任何想要使用此方法的人,请记住在函数定义之后应直接使用locals(),否则它将包含函数中定义的所有变量。

有趣的是,locals()返回局部变量的快照,而不是指向某个内置字典的指针。因此,如果稍后定义变量或在函数内更改参数,则分配给locals()的任何内容都不会更改。这就是你想要的。 (我是Python。)

另外有趣的是,如果在方法中使用locals(),则dict中的一个键是"self"。因此,请确保您更正/说明这一点。

您可以使用inspect模块:

def foo(x):

return x

inspect.getargspec(foo)

Out[23]: ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)

这与此相关。

你不能在一个功能内做到这一点,对吗?

如果参数不符合预期,我会使用*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)

这里有一个使用装饰器的解决方案。

您可以使用以下方法创建列表:

args = [a, b, c]

您可以使用以下方法轻松创建元组:

args = (a, b, c)

这与JavaScript的arguments或PHP的func_get_args()不同,这正是我正在寻找的。

你在标题中指定了参数?

为什么不简单地在身体中使用相同的信息?

def foo(a, b, c):

params = [a, b, c]

我错过了什么?

这与JavaScript的arguments或PHP的func_get_args()不同,这正是我正在寻找的。

我明白那个。缺少的是为什么你想要这样的功能。使用您已有的信息有什么问题?

他可能想要将它抽象为一个,所以他编写了一个可以处理所有函数的帮助器,而不必一直手动编写每个函数。例如。 log_methods_arguments(参数)

@Nikos:您log_methods_arguments示例可以采用*args, **kwargs参数。 OP表示必须指定准确的参数。这种代码味道的动机尚不清楚。

log_methods_arguments取* args,** kwargs不会改变任何东西。您仍然需要从要记录的方法获取参数列表,即调用log_method_arguments的方法。

并指定精确的参数不是一些"代码味道"!这是一种最佳实践...... * args,** kwargs只应在有特殊需要的时候使用......

我们似乎处于交叉目的。如果要编写通用日志函数,可以使用* args。如果要指定函数的参数,则可以。如果要创建指定参数的字典,可以(如此答案所示)。这些似乎涵盖了所有必需的情况。需要解决的问题是什么,需要更复杂的情况?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值