В Python 2.7 объекты словаря не поддерживают порядок вставки. Наблюдайте за порядком, который выдается:
In [3]: pipeline = {
...: 'initializer' : 'initializer()',
...: 'preprocesser' : 'preprocesser()'
...: }
In [4]: list(pipeline)
Out[4]: ['preprocesser', 'initializer']
Итак, предварительный процессор запустил first . Вам вообще не нужно dict
здесь, вы могли бы просто использовать список кортежей или, если по какой-то другой причине ваш код требует указания, тогда вы можете хранить список ключей в том порядке, в каком вы хотите запустить вещи.
Но в целом весь этот подход не рекомендуется. Не используйте exec
здесь, это не дает вам никаких преимуществ, а динамическое c выполнение кода имеет много недостатков, и в этом случае оно совершенно не нужно. Почти во всех случаях, включая этот, это явный антипаттерн.
Кроме того, не использует изменяемое глобальное состояние . Это еще один другой известный антипаттерн. Вместо этого явно передает аргументы функциям . Вот как я бы это сделал:
In [9]: def initializer(params):
...: params['data'] = 42
...: return params
...:
...: def preprocesser(params):
...: print(params.keys())
...:
In [10]: pipeline = [(initializer, (params,)), (preprocesser, (params,))]
In [11]: for func, args in pipeline:
...: func(*args)
...:
['instruction', 'data', 'dataset']
In [12]: params
Out[12]:
{'data': 42,
'dataset': './data/housing.csv',
'instruction': 'Predict median house value'}
Теперь, как правило, также считается анти-паттерном для функций, изменяющих свои входы, но это должно привести вас к более вменяемый подход ..
Наконец, вам следует избегать использования Python 2, он истек официальный срок службы, больше не будет даже обновлений безопасности и большинство основных сторонних библиотек также перестали поддерживать , включая pandas
, который вы используете.