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

时间:2017-02-27 16:01:17

标签: 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 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)

我尝试摆弄execlocals().update(dict),但这些对我没用。

2 个答案:

答案 0 :(得分:2)

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

def b(**kwargs):
    print(kwargs['a'])
    print(kwargs['d'])

可能是很多前期工作,最终可能是值得的。即使有@das-g的优秀答案,您仍然需要明确写下您想要使用的所有名称。

如果bkwargs字典的最后停止点,则应考虑使用@das-g's approach并明确列出所需的参数。这提高了清晰度,使文档和注释更容易。

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

答案 1 :(得分:1)

这有效:

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,它会很乐意忽略。)

显式关键字参数前面的*,使它们不能用作位置参数。如果您不想要这个限制,请忽略*,