Определение моей собственной непохожей константы Python

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

Когда я читаю и создаю свои инструкции по обновлению, я должен различать обновление, в котором был предоставлен столбец (например, MiddleName), но он был пустым (что означает отсутствие среднего имени и поля должно быть обновлено до NULL), и обновление, в котором MiddleName поле не было включено (это означает, что обновление вообще не должно касаться столбца среднего имени).

Первая ситуация (столбец предоставлен, но не имеет значения) представляется соответствующим образом представленнойНикто значение. Для второй ситуации, однако, яхотел бы иметьNotInFile "значение" что я могу использовать аналогично тому, как я использую None.

Правильный ли способ реализовать это следующим образом?

NotInFile = 1

class PersonUpdate(object):

     def __init__(self):

         self.PersonID = None
         self.FirstName = NotInFile
         self.MiddleName = NotInFile

а потом в другом модуле

import othermod
upd = othermod.PersonUpdate()
if upd.MiddleName is othermod.NotInFile:
    print 'Hey, middle name was not supplied'
 yedpodtrzitko24 июн. 2013 г., 16:29
Inifinity не делаетНе имеет смысла, я согласен. Но там'нет шансов, что его значение может быть неверно истолковано.)
 Larry Lustig24 июн. 2013 г., 16:27
Потому что False является допустимым значением для некоторых столбцов. Бесконечность неКажется, в этом нет никакого смысла. Я подумывал об использовании NotImplemented, которая является доступной константой, но она имеетсобственный смысл.
 yedpodtrzitko24 июн. 2013 г., 16:26
почему Дон'т вы используетеFalse как 'столбец предоставлен, но не имеет значения '? Или как насчетInfinity, Это'Это еще одна особая ценность.) Или вы можете наследоватьException класс с некоторыми пользовательскими:NotProvided(Exception)

Ответы на вопрос(2)

Решение Вопроса

1 ISN»t обязательно лучшее значение часового, поскольку оно является кешированной константой в Cpython. (например.-1+2 is 1 вернусьTrue). В этих случаях я мог бы рассмотреть возможность использования экземпляра объекта стража:

NotInFile = object()

Python также предоставляет несколько других именованных констант, которые вы можете использовать, если это кажется подходящим:NotImplemented а такжеEllipsis прийти на ум сразу. (Обратите внимание, что яЯ не рекомендую вам использовать эти константы ... Ям просто предоставив больше опций).

 Larry Lustig24 июн. 2013 г., 16:29
Я видел NotImplemented, который "звуки» близко к тому, что яя делаю, но отбросил идею, так как она естьсобственный смысл. Спасибо за информацию об использовании объекта, однако я не знал о проблеме кэширования.

использование целого числа - плохая идея. Это может сработать в этом случае, еслиMiddleName всегда строка илиNone, но в целом реализация свободна для интернирования целых чисел, строк, кортежей и других неизменяемых значений по своему усмотрению. CPython делает это для маленьких целых чисел и констант вышеупомянутых типов. PyPy определяетis по значению для целых чисел и нескольких других типов. Так что еслиMiddleName 1, тыОбязательно посмотрите, что ваш код считается не предоставленным.

Используйтеobject вместо этого каждый новый объект имеет особую идентичность:

NotInFile = object()

В качестве альтернативы, для лучшего вывода отладки определите свой собственный класс:

class NotInFileType(object):
    # __slots__ = () if you want to save a few bytes
    def __repr__(self):
        return 'NotInFile'

NotInFile = NotInFileType()
del NotInFileType # look ma, no singleton

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

Ваш ответ на вопрос