Как я могу переопределить константу в импортированном модуле Python?

В моем приложении я использую модуль в пакете example с именем examplemod.

Мое приложение:

from example import examplemod
examplemod.do_stuff()

Он импортирует другой модуль в example примерно так.

examplemod.py:

from example import config
# uses config
# then does stuff

config использует константу.

config.py:

CONSTANT = "Unfortunate value"

Я хотел бы переопределить эту константу, когда я использую examplemod в своем приложении (установив для него CONSTANT = "Better value"), и я бы предпочел не изменять базовый модуль, чтобы мне не пришлось поддерживать свой собственный пакет. Как я могу это сделать?

12 голосов | спросил Dave Forgac 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 19 Sep 2012 17:45:55 +0400 2012, 17:45:55

4 ответа


0

Спасибо всем за ваши ответы. Они указали мне в правильном направлении, хотя ни один из них не работал как написано. Я закончил тем, что сделал следующее:

import example.config
example.config.CONSTANT = "Better value"

from example import examplemod
examplemod.do_stuff()
# desired result!

(Кроме того, я отправляю патч для сопровождающего модуля, чтобы сделать CONSTANT настраиваемым параметром, поэтому мне не нужно этого делать, но нужно установить стандартный модуль в это время.)

ответил Dave Forgac 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 19 Sep 2012 18:27:30 +0400 2012, 18:27:30
0

Да, но он будет работать должным образом только с полностью определенными путями доступа к модулям:

import example
example.examplemod.config.CONSTANT = "Better value"
example.examplemod.do_stuff()
ответил vartec 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 19 Sep 2012 17:52:58 +0400 2012, 17:52:58
0

Я не уверен, достаточно ли этого или нет, но вы пробовали:

from example import config
config.CONSTANT = "A desirable value"

Обязательно сделайте это до импорта examplemod. Это должно работать, потому что Python кеширует импорт, поэтому измененный вами config будет таким же, как examplemod получает.

ответил ubershmekel 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 19 Sep 2012 17:49:49 +0400 2012, 17:49:49
0

Это называется исправление обезьян , и оно довольно распространено, хотя и не является предпочтительным, если есть другой способ выполнить то же самое:

examplemod.config.CONSTANT = "Better value"

Проблема в том, что вы полагаетесь на внутренние компоненты examplemod и config остается неизменным, поэтому он может сломаться, если какой-либо модуль изменится.

ответил ecatmur 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 19 Sep 2012 17:52:16 +0400 2012, 17:52:16

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132