簡體   English   中英

為什么此變量現在在python中跨模塊全局?

[英]Why is this variable now cross-module global in python?

我將稍微簡化代碼,以希望有人可以對此有所了解,如果我做錯了,也許可以給我一種更蟒蛇的方法。

內部dbcontrollers.py

import autosettings
import aerialcontroller
import controller
import gobject
import gtk
import utils

# Create the settings object so we can call and edit settings easily
SETTINGS = autosettings.autoSettings()
CONTROLLERS = {}

class dBControllers(object):

    def __init__(self):

        # This works happily so nothing wrong in autosettings module
        print SETTING.last_port
        port_to_use = SETTINGS.last_port

if __name__ == "__main__":

    # Create an object that holds all the GTK stuff (when not simplified)
    dBControllers = dBControllers()
    aerialController = aerialcontroller.aerialController()

內建Aerocontroller.py

class aerialController(object):

    def __init__(self):

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

但是,當我運行此命令時,出現“ NameError:全局名稱'SETTINGS'未定義”。

我真的不明白這應該如何工作,在模塊之間共享全局變量。 我認為這不是做這樣的事情的正確方法,所以有人可以指出我正確的方向。

謝謝。

PS Simply代碼示例將是有益的-仍然是python的相對新手。

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

注意:只要您只想修改 SETTINGS,就可以from settings import SETTINGS SETTINGS。 如果要用一組新的設置( SETTINGS = ... )完全替換它,則需要導入設置,並將其稱為settings.SETTINGS

這是設計使然:如果模塊從導入腳本的腳本中獲取了變量,那么在讀取代碼時(從其他地方導入模塊可能無法工作),很難看清它們的來源。 這樣,您始終可以看到變量來自每個文件的位置(嗯,幾乎總是這樣:請不要過度使用from <name> import * )。

我認為最明智的方法是使您的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 ,但這是在偏離主題……

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM