Python 如何返回locals(),然后在另一个函数中重新定义它们?

Python 如何返回locals(),然后在另一个函数中重新定义它们?,python,Python,我正在努力做到以下几点: def a(): a = ... b = ... ... n = ... return locals() def b(**kwargs): """Some function that would assign all keys and values in this function""" print(a) print(d) if __name__=="__main__": b(**a()) 我有

我正在努力做到以下几点:

def a():
    a = ...
    b = ...
    ...
    n = ...

    return locals()

def b(**kwargs):
    """Some function that would assign all keys and values in this function"""
   print(a)
   print(d)

if __name__=="__main__":
    b(**a())
我有一个很长的变量列表,我想做上述操作,而不是

def a():
    a = ...
    b = ...
    ...
    n = ...

    return a,b,c,d,e ... n

def b(a,b,c,d,e ... n):
   print(a)
   print(d)

if __name__=="__main__":
    a,b,c,d,e ... n = a()
    b(a,b,c,d,e,f ... n)
我试过摆弄
exec
locals().update(dict)
,但这些对我不起作用。

这有效:

def a():
    a = 1
    b = 2
    c = 3
    d = 4
    e = 5
    return locals()

def b(*, a, d, **kwargs):  # explicitly declare key word arguments you care about
    print(a)
    print(d)

b(**a())
# Prints
# 1
# 4
在函数签名中明确声明的关键字参数将在函数中相应名称的局部变量下可用,而不是作为
kwargs
的条目
**kwargs
仍然是必需的,这样函数就可以接受字典中的其余条目作为进一步的关键字参数(如果函数中没有使用
kwargs
,它将很乐意忽略)


显式关键字参数前面的
*,
阻止它们用作位置参数。如果您不想受此限制,请省略从Python3开始的
*,

语句,
exec
语句不再可用作在函数中创建实际本地词典的方法。这意味着,如果不显式地命名局部变量,就无法在函数中创建它们。如果您希望使用大量未命名的参数,您可能希望将它们作为字典项从
kwargs
引用。而您的评论表明,重写
b

def b(**kwargs):
    print(kwargs['a'])
    print(kwargs['d'])
可能有很多前期工作,最终可能是值得的。即使有了
@das-g
的优秀答案,您仍然需要显式地写出所有想要使用的名称

<> > <代码> b>代码>是您的代码> KWARGS字典的最后一个停止点,您应该考虑使用和列出需要显式的参数。这提高了清晰度,使文档和注释变得更容易


如果您打算将
kwargs
b
传递给其他函数,列出参数将有效地将它们从
kwargs
中删除,因此您可能应该使用我上面描述的方法。

您有什么理由不能使用
kwargs['a']
b
中的
exec
的可能副本只会在py2中对您有所帮助,只需将
globals()
替换为
locals()
。我认为这是显而易见的。更新
locals()
可能并不总是有效:你能解释一下你的答案吗?目标之一是消除在
b
@p014k签名中明确声明我关心的每个参数的需要。为什么?如果您使用的是所有参数,为什么不列出它们呢。如果没有别的,它会使事情更加明确。此外,它还允许您更好地记录输入。听起来很矛盾:如果函数太大而无法重写,那么它就太大了。因此应该重写。@das-g。我想你刚刚找到了一个矛盾的方式来表达一个非常合理的原则:)