2012-09-19 12 views
8

W mojej aplikacji korzystam z modułu w pakiecie example o nazwie examplemod.Jak mogę przesłonić stałą w importowanym module Pythona?

Moja aplikacja:

from example import examplemod 
examplemod.do_stuff() 

To importuje innego modułu wewnątrz example jak tak.

examplemod.py:

from example import config 
# uses config 
# then does stuff 

config wykorzystuje stałą.

config.py:

CONSTANT = "Unfortunate value" 

Chciałbym, aby zastąpić tę stałą kiedy używam examplemod w mojej aplikacji (ustawienie go na CONSTANT = "Better value") i wolałbym, aby nie modyfikować instrumentu bazowego moduł, więc nie muszę utrzymywać własnego pakietu. Jak mogę to zrobić?

+0

Mogę się mylić, ale myślę, że możesz po prostu przypisać wartość do zmiennej po jej zaimportowaniu. – Borgleader

Odpowiedz

3

Dziękuję wszystkim za odpowiedzi. Wskazali mi w dobrym kierunku, chociaż żaden z nich nie pracował tak, jak napisano. Skończyło się w następujący sposób:

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

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

(Również jestem złożenie poprawki do opiekuna modułu, aby Stała A konfigurowalny opcji więc nie mam z tym zrobić, ale trzeba zainstalować moduł free w międzyczasie.)

1

Nie jestem pewien, czy to wystarczy, czy nie, ale nie spróbować:

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

Upewnij się, aby to zrobić przed examplemod jest importowana. To powinno działać, ponieważ Python buforuje import, więc zmodyfikowany config będzie taki sam jak examplemod.

1

To się nazywa monkey patching, i to dość często, choć nie jest to korzystne, czy istnieje inny sposób, aby osiągnąć to samo:

examplemod.config.CONSTANT = "Better value" 

Kwestia jest taka, że ​​jesteś powołując się na wewnętrznych części examplemod i config pozostający tak samo, więc może to pęknąć, jeśli którykolwiek z modułów ulegnie zmianie.

12

Tak, ale to będzie działać tylko zgodnie z oczekiwaniami w pełni wykwalifikowanych ścieżek dostępu do modułów:

import example 
example.examplemod.config.CONSTANT = "Better value" 
example.examplemod.do_stuff() 
+0

Warto również wspomnieć, że jeśli moduł examplemod zaimportował CONSTANT bezpośrednio do swojej tabeli symboli ze składnią 'from config import CONSTANT', musiałbyś zrobić' example.examplemod.CONSTANT = "Lepsza wartość" ', ponieważ wtedy testplemod miałby własne odniesienie do CONSTANT. Formularz, którego używasz, zastępuje config.CONSTANT, który działa w przypadku, gdy moduł examplemod używa 'from configplemod import config; config.CONSTANT'. – Symmetric

Powiązane problemy