Импортировать модуль с параметром в Python

Можно ли импортировать модуль с каким-либо параметром в Python?

Под параметром я подразумеваю то, что в модуле существует переменная, которая не инициализирована в этом модуле, но я использую эту переменную в этом модуле. Короче говоря, я хочу, чтобы поведение было похоже на функцию, но в отличие от функции, я хочу, чтобы переменные модуля отображались в вызывающем коде.

eg a.py:

#lists like data, count, prob_distribution are constructed from training_pool (not initialized in this file)
x = pymc.Uniform('x', lower = 0, upper = 1)
rv = [ Multinomial("rv"+str(i), count[i], prob_distribution[i], value = data[i], observed=True) for i in xrange(0, len(count)) ]

b.py:

import a  #I want some way tr pass value of training_pool
m = pymc.MCMC(a)

Я хочу, чтобы все случайные переменные в a.py были доступны MCMC. Я открыт для лучшего подхода к моей проблеме, но я также хотел бы знать, возможна ли передача аргументов модулям в python или нет.


person turing    schedule 05.06.2014    source источник
comment
Вы просите from a import *?   -  person BrenBarn    schedule 05.06.2014
comment
Я думаю, он просит глобальные объекты для всего модуля.   -  person Jonathon Reinhart    schedule 05.06.2014
comment
Оберните свой код в a.py в функцию и вместо этого передайте ей параметры!   -  person Oleg Sklyar    schedule 05.06.2014
comment
@Oleg, я не хочу этого делать, так как в этом случае эти переменные, такие как x, rv, станут локальными переменными функции, и MCMC не сможет выполнять выборку из них   -  person turing    schedule 05.06.2014
comment
Это необычный шаблон для использования, но похоже, что именно так все делается в pymc ... Предложите скопировать один из их рабочих примеров, а затем изменить его, чтобы понять, что происходит   -  person John Greenall    schedule 05.06.2014


Ответы (6)


Как уже ответил @otus, нет возможности передавать параметры модулям.

Я думаю, вы следуете некоторым вводным примерам для PyMC2, в которых используется шаблон, в котором модуль обертывает весь код для узлов в байесовской модели. Этот подход хорош для начала, но, как вы обнаружили, может быть ограничивающим, когда вы хотите запустить свою модель с рядом вариаций.

К счастью, PyMC2 может создать объект MCMC из списка или словаря, а также из модуля. В этом случае я рекомендую именно то, что @ oleg-s предложил в комментариях: использовать функцию. Вы можете завершить функцию с помощью return locals(), чтобы получить словарь всего, что могло бы быть в модуле, и это подходящий ввод для конструктора pymc.MCMC. Вот пример:

# a.py
from pymc import *

count = [10, 10] # perhaps good to put this stuff in data.py
prob_distribution = [[.5, .5], [.1, .2, .7]]
data = [[2, 8], [2, 3, 5]]

def model(training_pool):
    x = Uniform('x', lower = 0, upper = 1)
    rv = [ Multinomial("rv"+str(i), count[i], prob_distribution[i], value = data[i], observed=True) for i in training_pool ]

    return locals()

# b.py
import pymc, a

training_pool = [0]
m = pymc.MCMC(a.model(training_pool))
person Abraham D Flaxman    schedule 05.06.2014

Я счел полезным определить глобальные переменные и разрешить их устанавливать с помощью функции инициализации.

def init(config_filename=CONFIG_FILENAME):
    config = configparser.ConfigParser(interpolation=configparser.ExtendedInterpolation())
    config.read(config_filename)

    global YEARS
    YEARS = config['DEFAULT']['YEARS']
    global FEATURES
    FEATURES = config['DEFAULT']['FEATURES']

Тогда все, что нужно сделать пользователю, это не забыть инициализировать модуль перед использованием этих методов:

import module
module.init('config.ini')

Обратите внимание: я бы НЕ использовал это в модуле, который, как я ожидаю, будет распространен публично. Это больше для однофайловых модулей для личного пользования.

person Josiah Yoder    schedule 06.07.2018

для этого есть разные подходы, вот простой и глупый:

main.py

"""A silly example - main supplies a parameter
"""

import sys,os

print os.path.basename(__file__)+":Push it by: --myModuleParam "+str(123)
sys.argv.append('--myModuleParam')
sys.argv.append(123)
import module


print os.path.basename(__file__)+":Pushed my  param:"+str(module.displayMyParam)

module.py

"""A silly example - module consumes parameter
"""

import sys,os

displayMyParam = 'NotYetInitialized'

for px in sys.argv:
    if px == '--myModuleParam':
        idx = sys.argv.index(px)
        sys.argv.pop(idx) # remove option
        displayMyParam = sys.argv[idx]
        sys.argv.pop(idx) # remove value
        print os.path.basename(__file__)+":Got my param:"+str(displayMyParam)

#
# That's it...
#
person acue    schedule 23.07.2016

Нет возможности передавать параметры модулям. Однако для этого вы можете использовать глобал в третьем модуле:

# a.py
parameter = None

# b.py
import a
a.parameter = 4
import c

# c.py
import a
# use a.parameter

Конечно, это работает только в том случае, если ничто другое не импортирует c, потому что модули импортируются только один раз.

person otus    schedule 05.06.2014

Глобальные переменные на уровне модуля действительно должны быть достаточными для большинства случаев, но что, если

  • параметр необходимо оценить во время инициализации модуля, или
  • вам нужно несколько версий модуля с разными параметрами

В последних версиях python можно загрузить в два этапа: сначала spec, а затем exec. В середине вы можете установить дополнительные переменные.

import importlib
abstract=importlib.util.find_spec('myModule')
module4=importlib.util.module_from_spec(abstractModule.__spec__)
module2=importlib.util.module_from_spec(abstractModule.__spec__)
module2.parameter="you are version 2"
module4.parameter="you are version 4"
module4.__spec__.loader.exec_module(module4)
module2.__spec__.loader.exec_module(module2)

В модуле вы можете проверить dir() или аналогичный, чтобы узнать, определена ли переменная.

person arivero    schedule 08.10.2020

Такого способа передачи параметров в модуль не существует, однако вы можете немного изменить свой код и импортировать параметры из модуля как глобальные параметры.

person Nupur Thakur    schedule 13.10.2020
comment
Добро пожаловать в SO! Прочтите тур и Как сделать Пишу хороший ответ? - person Tomer Shetah; 13.10.2020