【问题标题】:Convert dictionary entries into variables in function将字典条目转换为函数中的变量
【发布时间】:2022-01-23 12:31:18
【问题描述】:

我想从 dict 中获取函数工作的变量。

简单示例

>>> def func(atrs):
...     for k,v in atrs.items():
...             exec(k + '=v')
...     
...     # do smth here with vars
...     
...     print(locals())   # lets see that 'a' exists
...     print(a)          # lets use 'a'

在我使用这个函数后,我得到了错误。

>>> func({'a':1, 'b':5})
{'atrs': {'a': 1, 'b': 5}, 'k': 'b', 'v': 5, 'a': 1, 'b': 5}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in func
NameError: name 'a' is not defined

但我们可以看到“a”存在于已定义的变量中。 我做错了什么?

我看到了,如果我们不使用函数,它就可以工作。 Convert dictionary entries into variables

但我需要使用函数。

【问题讨论】:

    标签: python function dictionary nameerror


    【解决方案1】:

    我强烈不鼓励您使用这种方法,但您可以使用locals()(或vars())动态创建变量:

    def func(attrs):
        for k, v in attrs.items():
            locals()[k] = v
        print(locals())
        print(a)
        print(b)
    
    func({'a':1, 'b':5})
    

    输出:

    {'attrs': {'a': 1, 'b': 5}, 'k': 'b', 'v': 5, 'a': 1, 'b': 5}
    1
    5
    

    如果您希望此变量存在于func 函数的范围之外,请将locals()vars() 替换为globals()

    【讨论】:

    • 不,我只是得到同样的错误: NameError: name 'a' is not defined 我的 python 解释器有问题吗?
    • 你复制/粘贴我的代码吗?
    • 是的,我复制粘贴您的代码。 imgur.com/3PZwMAG
    • 我不明白这个问题。你的代码对我有用!
    【解决方案2】:

    好的,我不明白为什么,但如果我们将这个变量定义为全局变量,而不是局部变量,它就会起作用。

    def func(attrs):
        for k, v in attrs.items():
            globals()[k] = v
        
        # or we can use this instead of 'for' loop
        # globals().update(attrs)
        
        print(locals())
        print(globals())
        print(a)
        print(b)
    
    func({'a':1, 'b':5})
    

    输出

    {'attrs': {'a': 1, 'b': 5}, 'k': 'b', 'v': 5}
    {'__name__': '__main__', ..., 'a': 1, 'b': 5}
    1
    5
    

    【讨论】:

      猜你喜欢
      • 2013-08-08
      • 1970-01-01
      • 2021-11-06
      • 2019-11-04
      • 2019-12-03
      • 2016-09-28
      • 2021-06-17
      • 1970-01-01
      • 2013-11-17
      相关资源
      最近更新 更多