Почему эта переменная теперь является кросс-модульной в Python? - PullRequest
0 голосов
/ 06 декабря 2010

Я немного упросту код в надежде, что кто-то может пролить свет на это, и, возможно, даст мне более питонический подход, если то, что я делаю, не так.*

Внутри aerialcontroller.py

class aerialController(object):

    def __init__(self):

        self.motor_number = str(SETTINGS.aerial_motor_number)
        CONTROLLERS[self.motor_number] = self

Но когда я запускаю это, я получаю «NameError: глобальное имя« SETTINGS »не определено».

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

Спасибо.

PS Просто примеры кода были бы полезны - все ещеотносительный новичок в питоне.

Ответы [ 2 ]

3 голосов
/ 06 декабря 2010

В Python нет способа поделиться именем между модулями.Если есть что-то, к чему вы хотите получить доступ из нескольких модулей, вы объявляете это в отдельном модуле (например, «настройки»), а затем импортируете это куда хотите.

settings.py:

SETTINGS = autosettings.autoSettings()
CONTROLLERS = {}

aerialcontroller.py

from settings import SETTINGS, CONTROLLERS
class aerialController(object):

    def __init__(self):
        self.motor_number = str(SETTINGS.aerial_motor_number)
        CONTROLLERS[self.motor_number] = self

Примечание. from settings import SETTINGS будет работать столько, сколько вам нужно изменить НАСТРОЙКИ.Если вы хотите полностью заменить его новым набором настроек (SETTINGS = ...), вам необходимо выполнить настройки импорта и обозначить его как settings.SETTINGS.

Это сделано специально: если модули получили переменные изВ сценарии, который их импортировал, было бы намного сложнее увидеть, откуда они взялись при чтении кода (а импорт модуля из другого места может не сработать).Делая это таким образом, вы всегда можете увидеть, откуда переменная находится внутри каждого файла (ну, почти всегда: пожалуйста, не злоупотребляйте from <name> import *).

1 голос
/ 06 декабря 2010

Думаю, самый разумный способ - заставить ваш aerialController класс взять объект настроек и контроллеров:

class aerialController(object):

    def __init__(self, settings, controllers):
        self.motor_number = str(settings.aerial_motor_number)
        controllers[self.motor_number] = self

... и затем в другом модуле:

if __name__ == "__main__":
    dBControllers = dBControllers()
    aerialController = aerialcontroller.aerialController(SETTINGS, CONTROLLERS)

Вероятно, вы могли бы структурировать это еще лучше и передать номер двигателя, и вызывающий абонент выполняет присвоение controllers, но это отклоняется от темы ...

...