Python exec()全局更新参数,但是在另一个函数中时找不到

问题描述 投票:0回答:1

所以我正在使用python 2.7。

我正在使用此行在字典中执行一系列语句:

for key in pipeline: 
    exec(dictionary[key], globals(), globals())

这是管道包含的内容:

pipeline = {
    'initializer' : 'initializer()',
    'preprocesser' : 'preprocesser()'
}

这是两个initializer()和preprocesser()函数:

def initializer():
    global params 

    data = pd.read_csv(params['dataset'])
    data.fillna(0, inplace=True)
    params['data'] = data
    return params 

def preprocesser():
    global params
    print(params.keys())

这两个函数都修改了一个称为params的全局字典,这是它的样子:

params = {
                'instruction' : "Predict median house value", 
                'dataset' : './data/housing.csv', 
}

出于某种原因,如果我打印出params的字典键,它将打印更新的键:initializer()函数应该在全局params字典中添加一个“数据”键。但是,如果我打印出preprocessor()函数中的键列表,我只会得到['instruction','dataset']。如果我在调用exec函数之后(在全局范围内)立即打印出键,则它会正确打印出['instruction','dataset','data]。为什么要全局更新,但是之后我无法在preprocesser()函数中访问该更新的参数。我该如何解决?

python dictionary scope exec global
1个回答
0
投票
在Python 2.7中,字典对象不保持插入顺序。观察产生的顺序:

In [3]: pipeline = { ...: 'initializer' : 'initializer()', ...: 'preprocesser' : 'preprocesser()' ...: } In [4]: list(pipeline) Out[4]: ['preprocesser', 'initializer']

因此,预处理程序运行了[[first。您实际上根本不需要dict,您可以只使用一个元组列表,或者如果由于某些其他原因您的代码需要一个dict,则可以按想要的顺序保留键列表。运行的东西。 

但是总的来说,不建议您采用整个方法。不要在这里使用exec,它没有任何优势,动态代码执行也有很多弊端,在这种情况下完全没有必要。

© www.soinside.com 2019 - 2024. All rights reserved.