Как импортированный модуль должен иметь доступ к глобальным константам (VERBOSE = True) и т. Д.? - PullRequest
0 голосов
/ 30 апреля 2018

Мне сложно понять, как следует определять константы в модульном коде (используя модули main.py + 2), здесь в этом примере константы VERBOSE и SAMPLINGRATE.

main.py

VERBOSE = True
SAMPLINGRATE = 44100

import numpy
from module1 import Class1
from module2 import Class2

items1 = []
items2 = []

for i in range(100):
    items1.append(Class1(i))
    items2.append(Class2(i))

module1.py

import numpy

class Class1: 
    def __init__(self, i):
        self.i = i
        ...

    def dosomething(self):
        ...
        if VERBOSE:
            print "We did this and this..."

module2.py

import numpy

class Class2: 
    def __init__(self, i):
        self.i = i
        ...
        self.blah = SAMPLINGRATE * i

        if VERBOSE:
            print "We did this and this..."

Вопрос: Как и где следует определять константы VERBOSE и SAMPLINGRATE?

Примечание:

  • Я не могу передать все эти константы в качестве аргумента при создании экземпляров Class1, потому что если это так, я должен был бы сделать эту уродливую вещь в main.py:

    for i in range(100):
        ...Class1(i, verbose=VERBOSE, samplingrate=SAMPLINGRATE, <lotsofconstantshere>))...
    
  • Я использую модульную конструкцию, потому что хочу, чтобы module1.py использовался для других проектов , чем main.py. Поэтому, если я импортирую module1.py в другой проект projectB.py, я бы хотел, чтобы значение по умолчанию для VERBOSE было False.

1 Ответ

0 голосов
/ 30 апреля 2018

В Python нет действительно глобального пространства имен. У вас должен быть общий модуль, который каждый импортирует. Лучше всего, если общий модуль имеет мало побочных эффектов (например, импортирует другой модуль, который может создавать циклические зависимости). main.py является особенно плохим контейнером, потому что это скрипт верхнего уровня и вовсе не является модулем. Другие импортеры получат другой main в качестве модуля.

Чтобы вы могли создать config.py

VERBOSE = True
SAMPLINGRATE = 44100    

и все ваши модули просто делают

from config import *
...