Попробуйте Python, за исключением того, что вы не используете импортированную переменную

Импортированный модуль, connection_status_message.py:

connection_status_message = "Not Connected"

Попробуйте кроме файла connect_to_server.py:

from Server.connection_status_message import connection_status_message

def connect_to_server(host,user,password):
    try:
        connect(host,user,password)
    except NoConnection:
        connection_status_message = "Could not reach host..."
        return
...

Проблема в том, что переменную пытаются сделать локальной. Итак, я прочитал об этой проблеме и увидел, как ссылаться на глобальную переменную:

def connect_to_server(host,user,password):
    try:
        connect(host,user,password)
    except NoConnection:
        global connection_status_message
        connection_status_message = "Could not reach host..."
        return
...

Но теперь PyCharm заявляет, что оператор импорта вверху больше не используется.

Как я могу заставить этот Try/Except использовать импортированную переменную?


person e15purple    schedule 02.02.2018    source источник
comment
Возможный дубликат Как я могу переопределить константу в импортированный модуль Python?   -  person Markon    schedule 02.02.2018
comment
Рассмотрите возможность использования подхода ООП, создав класс с именем Connection, который обрабатывает connect() и имеет атрибут connection_status_message.   -  person r.ook    schedule 02.02.2018
comment
pass — это ключевое слово. Вы не можете использовать его как имя переменной.   -  person Ryan Haining    schedule 02.02.2018
comment
pass было просто аббревиатурой. Я не знал, что это ключевое слово, поэтому я изменил его на password в вопросе, чтобы избежать путаницы. Извиняюсь.   -  person e15purple    schedule 03.02.2018


Ответы (1)


Я не смог воспроизвести вашу проблему, но если ваша строка import хранится в функции, переменная будет nonlocal вместо global:

def connect_to_server(host,user,password):
    try:
        connect(host,user,password)
    except NoConnection:
        nonlocal connection_status_message
        connection_status_message = "Could not reach host..."

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

from Server import connection_status_message as csm
csm.connection_status_message

# "No Connection"

def func():    
    csm.connection_status_message = "Could not reach host..."

csm.connection_status_message

# "Could not reach host..."

Вы также можете подумать о создании класса для обработки всего этого как объекта:

class Connection(object):
    def __init__(self):
        self.connection_status_message = "No Connection"
        # TODO: initialize your class

    def connect(self, host, user, password):
        # TODO code connect criteria stuff here

    def connect_to_server(self, host, user, password):
        try:
            self.connect(host,user,password)
        except NoConnection:
            self.connection_status_message = "Could not reach host..."
            # ... return whatever ...#

Теперь вы можете сделать from Server import Connection и создать локальный объект Connection для управления:

conn = Connection()
conn.connect_to_server(host, user, password)

Это может быть очевидно, но в любом случае значение сохраняется в памяти только во время этого выполнения. Фактическое connection_status_message.py никогда не обновляется этим значением.

person r.ook    schedule 02.02.2018