当局部变量名称与函数参数名称相同时,将关键字参数传递给函数

发布于 2024-11-04 19:09:42 字数 613 浏览 1 评论 0原文

有没有更简洁的方式来写这个?

f(a=a, b=b, c=c, d=d, e=e)

背景:我的函数有太多参数

f(a, b, c, d, e):
    pass

,我的程序有局部变量,其名称与函数参数完全相同。

a, b, c, d, e = range(5)

我想用关键字参数调用该函数。由于变量的名称相同,因此调用的外观如下。

g = f(a=a, b=b, c=c, d=d, e=e) # this can get very long

当然,我可以使用位置而不是像这样的关键字来传递参数

g = f(a, b, c, d, e) 

但是 a, b, c, d, e 只是此示例中的变量名称,很容易看出正确的顺序。然而不幸的是,我的程序中的变量命名更复杂,并且没有容易辨别的自然顺序。所以我真的很喜欢通过关键字传递它们以避免任何错误。

Is there a more succint way to write this?

f(a=a, b=b, c=c, d=d, e=e)

Background: I have a function with too many arguments

f(a, b, c, d, e):
    pass

I my program I have local variables that are named exactly same as the function parameters.

a, b, c, d, e = range(5)

I would like to call the function with keyword arguments. Since the variables are named the same, this is how the call would look.

g = f(a=a, b=b, c=c, d=d, e=e) # this can get very long

Of course, I can pass the aruguments using position instead of keywords like this

g = f(a, b, c, d, e) 

But a, b, c, d, e are just the names of variables in this example and it is easy to see the correct order. However unfortunately the variables in my program are named more complicatedly and there is no easily discernible natural order. So I really like to pass them by keyword to avoid any mistakes.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

暮凉 2024-11-11 19:09:42

您可以执行如下操作:

a, b, c, d, e = range(5)
arg_dict = lambda l: dict((k, globals()[k]) for k in l.split(', '))

arg_dict('a, b, c, d, e') => {'a': 0, 'c': 2, 'b': 1, 'e': 4, 'd': 3},所以你可以这样调用你的函数:

f(**arg_dict('a, b, c, d, e'))

这​​给了你能力准确指定要使用哪些变量。另一种不使用 globals() 的替代方法是使用 eval(),但它可能会使 lambda 的使用变得不安全。

arg_dict = lambda l: dict(zip(l.split(', '), eval(l)))

如果您希望将 locals() 作为参数传递,而不是在 lambda 中使用 globals(),您可以使用以下内容:

arg_dict = lambda l, d=locals(): dict((k, d[k]) for k in l.split(', '))
f(**arg_dict('a, b, c, d, e'))

感谢 senderle 获取 locals() 建议。

You could do something like the following:

a, b, c, d, e = range(5)
arg_dict = lambda l: dict((k, globals()[k]) for k in l.split(', '))

arg_dict('a, b, c, d, e') => {'a': 0, 'c': 2, 'b': 1, 'e': 4, 'd': 3}, so you can call your function like this:

f(**arg_dict('a, b, c, d, e'))

This gives you the ability to specify exactly which variables you want to use. An alternative method for this that does not use globals() would be to use eval(), but it could make the use of the lambda potentially unsafe.

arg_dict = lambda l: dict(zip(l.split(', '), eval(l)))

If you would prefer to pass locals() in as an argument instead of using globals() in the lambda you can use the following:

arg_dict = lambda l, d=locals(): dict((k, d[k]) for k in l.split(', '))
f(**arg_dict('a, b, c, d, e'))

Thanks to senderle for the locals() suggestions.

不回头走下去 2024-11-11 19:09:42

locals() 提供您的局部变量,因此您可以这样做

def somewhere():
  x = 3 # its a local
  f(**locals()) # same as f(x=3)

,但您肯定可以看到这是多么脆弱。

locals() gives your local variables, so you could do

def somewhere():
  x = 3 # its a local
  f(**locals()) # same as f(x=3)

but you can surely see how very fragile this is.

世态炎凉 2024-11-11 19:09:42

为什么这里不能使用 **kw ?

def foo(**kw):
    for k,v in kw.items():
       print k,v


foo(a=2)
foo(a=3, b=4)
foo(nonsene=True, blather=False)

Why can't you use **kw here?

def foo(**kw):
    for k,v in kw.items():
       print k,v


foo(a=2)
foo(a=3, b=4)
foo(nonsene=True, blather=False)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文