2013-07-10 3 views
2

Как я могу сделать специальный синглтон, например None? (Я новичок в Python.)Специальный синглтон (например, None)

Я хочу быть в состоянии сделать такую ​​вещь:

def create_mutations(d): 
    return [ 
     Mutation(c, v) 
     if v is not CellAction.Delete else 
     Mutation(c, isDelete=True) 
     for (c, v) in d 
     ] 

Используется так:

create_mutations({'a': 5, 'b': None, 'c': CellAction.Delete}) 

Это позволит создать список, содержащий три мутации, означающие «установить a на 5, установить b в None и удалить c».

Дело в том, что в определении create_mutations я не могу использовать ... if v is not None else ..., потому что тогда нет никакого различия между «установить b к None» и «удалить b

Я могу уточнить, неясен ли вопрос.

ответ

6

Вы можете просто создать экземпляр object где-то в вашем модуле или классе, как это:

Delete = object() 

Это достаточно для большинства случаев.

+0

Это прекрасно работает - я не понимал, что вы можете просто сбрасывать такую ​​строку на верхнем уровне в файле, определяющем классы. –

3

Просто сделайте какой-нибудь объект и дайте ему имя. Пустой класс будет делать:

class Delete: 
    pass 

Или, как отмечает Майкл, в object экземпляр.

Независимо от того, какой объект вы используете, следует изменить, если вы планируете его проверить, используя is; У Python есть привычка делиться экземплярами неизменяемых объектов. (Например, все пустые кортежи - это один и тот же объект.)

+0

Я видел несколько проектов, которые объединяют оба ответа, и имеют что-то вроде 'DELETE = Delete()' –

+0

@JonathanVanasco. Что это делает? – endolith

+0

С 'DELETE = object()', вы всегда должны проверять 'if foo is DELETE'. С помощью 'DELETE = Delete()' вы можете проверить использование 'if isinstance (DELETE, Delete)'. В зависимости от того, с чем вы работаете, может быть лучше использовать 'isinstance' с классом, чем' is' с объектом. Например, если вы сохраняете данные (рассол, полка, маршалл и т. Д.), 'DELETE = object()' будет отличаться при последующих прогонах вашей программы и не будет соответствовать вашим постоянным данным, однако тестирование против пользовательского 'Delete 'Class будет по-прежнему работать. –

1

Ну, простой ответ: вы не можете (ну, вы, , могли, но это не то, что вы хотите сделать).

Возможно, вы должны просто использовать класс здесь, например DeleteCell = object() (или вы можете иметь класс или модуль CellAction с различными действиями (другими классами) внутри него).

Смежные вопросы