python-3.x 在函数中设置字典中的全局变量

ac1kyiln  于 2022-12-15  发布在  Python
关注(0)|答案(1)|浏览(147)

我希望使用.yaml来管理一个程序的几个全局参数。我更喜欢在函数中管理这个参数,如下所示。然而,当globals().update()包含在函数中时,它似乎不起作用。另外,考虑到需要加载未知名称的变量的数量不确定,使用基本的global方法是不合适的。有什么想法吗?
.亚姆勒

test:
  - 12
  - 13
  - 14
  - stuff:
      john

test2: yo

巨蟒

import os
import yaml

def load_config():
    with open(os.path.join(os.getcwd(), {file}), 'r') as reader:
        vals = yaml.full_load(reader)
        globals().update(vals)

期望输出

load_config()

test
---------------
[12,13,14,{'stuff':'john'}]

test2
---------------
yo

我得到的

load_config()

test
---------------
NameError: name 'test' is not defined

test2
---------------
NameError: name 'test2' is not defined

请注意:{file}是给你的,代码实际上并不是这样写的。还要注意的是,我知道通常不推荐使用全局,但它是回答这个问题所必需的。

eh57zj3b

eh57zj3b1#

你的代码中有{file},我假设它只是一个实际文件名的字符串。我当然希望你不要看.format(),然后eval()这个代码?这将是一个非常糟糕和不安全的运行代码的方式。
只需返回字典vals本身,并根据需要访问它:

import os
import yaml

def load_config(fn):
    with open(os.path.join(os.getcwd(), fn), 'r') as reader:
        # only returning the value, so doing it in one step:
        return yaml.full_load(reader)

cfg = load_config('test.yaml')
print(cfg)
print(cfg['test2'])

输出:

{'test': [12, 13, 14, {'stuff': 'john'}], 'test2': 'yo'}
yo

你应该 * 绝对**决不 * 仅仅用外部文件的内容更新globals()globals()只用于非常特殊的用例。
获得所需的确切输出只是格式化字典内容的问题:

import os
import yaml

def load_config(fn):
    with open(os.path.join(os.getcwd(), fn), 'r') as reader:
        return yaml.full_load(reader)

def print_config(d):
    for k, v in d.items():
        print(f'{k}\n---------------\n{v}\n')

cfg = load_config('test.yaml')
print_config(cfg)

它给出了您描述的输出。
请注意,这在技术上是多余的:

os.path.join(os.getcwd(), fn)

默认情况下,文件操作在当前工作目录上执行,因此您可以使用以下命令实现相同的效果:

def load_config(fn):
    with open(fn, 'r') as reader:
        return yaml.full_load(reader)

如果您希望打开脚本所在 * 文件夹中的文件 *,请考虑以下做法:

def load_config(fn):
    with open(os.path.join(os.path.dirname(__file__), fn), 'r') as reader:
        return yaml.full_load(reader)

相关问题