Как инициализировать переменные в None / Undefined и сравнить с другими переменными в Python? - PullRequest
3 голосов
/ 29 апреля 2009

В основном у меня есть некоторые переменные, которые я не хочу предварительно инициализировать:

originalTime = None
recentTime = None
postTime = None

def DoSomething ( ) :
    if originalTime == None or (postTime - recentTime).seconds > 5 :
        ...

Я получаю ошибку компиляции, если:

UnboundLocalError: local variable 'originalTime' referenced before assignment

Как видите, все переменные имеют разные отношения, которые либо должны быть установлены правильно (время, время + 5 и т. Д.), Либо вообще не заданы, но я не хочу устанавливать для них предварительно рассчитанные значения при их объявлении. Нет проще.

Есть идеи?

Ответы [ 6 ]

14 голосов
/ 29 апреля 2009

Мне нужно исправить Джаррет Харди, и так как у меня недостаточно репутации, чтобы комментировать.

Глобальный охват не является проблемой. Python будет автоматически искать имена переменных во вложенных областях. Единственная проблема заключается в том, когда вы хотите изменить значение. Если вы просто переопределите переменную, Python создаст новую локальную переменную, если вы не используете ключевое слово global. Так

originalTime = None

def doSomething():
  if originalTime:
    print "originalTime is not None and does not evaluate to False"
  else:
    print "originalTime is None or evaluates to False"

def doSomethingElse():
  originalTime = True

def doSomethingCompletelyDifferent()
  global originalTime
  originalTime = True

doSomething()
doSomethingElse()
doSomething()
doSomethingCompletelyDifferent()
doSomething()

Должен вывести:

originalTime is None or evaluates to False
originalTime is None or evaluates to False
originalTime is not None and does not evaluate to False

Я второй раз предупреждаю, что это плохой дизайн.

6 голосов
/ 29 апреля 2009

Ваш код должен был работать, я предполагаю, что он внутри функции, но originalTime определен где-то еще Также немного лучше сказать originalTime is None, если вы действительно этого хотите или даже лучше, not originalTime.

0 голосов
/ 01 июня 2017

==> если начальное значение Нет

>>>toto = None

>>>toto = toto if toto is not None else "default Value"

>>>toto

'default value'

==> в случае, если переменная просто не существует

>>>del toto

>>>toto = toto if locals().get('toto') else "default Value"

>>> toto

'default value'

==> та же команда, если установлено значение

>>>toto = 1

>>>toto

1

>>>toto = toto if locals().get('toto') else "default Value"

1
0 голосов
/ 29 апреля 2009

На самом деле нет никакого "красивого" способа обойти это. Исходя из названий переменных, которые вы дали, мой первый инстинкт - создать объект:

class SomeTimeClass(object):
    def __init__(self, recentTime=None, originalTime=None, postTime=None):
        self.recentTime = recentTime
        self.originalTime = originalTime
        self.postTime = postTime

time = SomeTimeClass()
if not time.recentTime::
    ...

Это может сработать, потому что звучит так, как будто переменные коррелированы. Пара других опций:

Оберните процедуру в функцию:

def SomeFunc(recentTime=None, originalTime=None, postTime=None):
    if not recentTime:
        ... 

Используйте диктовку:

some_dict = {}

if not some_dict.get('originalTime', None): #return None if key doesn't exist
    ...
0 голосов
/ 29 апреля 2009

Если оператор if находится внутри функции, но объявления = None находятся на уровне модуля, то переменные находятся вне области действия внутри функции. Самое простое решение - явно указать, что идентификаторы переменных находятся в глобальной области видимости:

def doSomething():
    global originalTime
    if originalTime:
        print "originalTime exists and does not evaluate to False"

Многие считают это плохим дизайном Python, кстати. Если вы согласны с этой оценкой и ваша архитектура позволяет, вы можете реорганизовать вашу функцию, чтобы она получала внешние зависимости в качестве аргументов функции.

0 голосов
/ 29 апреля 2009

Я только что попробовал ваш код в оболочке, но не получил ошибку. Он должен работать. Может опубликовать весь код? Вы также можете использовать try / catch.

Или, может быть, localals (). Has_key ('originalTime')?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...