2015-12-13 6 views
3

В описании языка python упоминаются три объекта, которые имеют единственный уникальный экземпляр: None, NotImplemented и Ellipsis (section 3.2 "The Standard Type Hierarchy"). Тест x is None является распространенной идиомой, гарантируемой гарантией уникальности None. Я не могу найти никакого упоминания об объектах уникального экземпляра, будь то в документации на python или при переполнении стека. Несколько вопросов, таких как this one, содержат интересные предложения о способах создания таких объектов, но я хочу знать, есть ли какие-либо из этих трех встроенных модулей, которые я пропустил.Другие объекты уникального экземпляра, кроме None в python?

Например, () представляется уникальным (по общему признанию, очень ограниченным тестированием в CPython), также является ли тест x is() безопасным? Или x ==() обязательный для этого случая?

+0

Нет смысла тестировать 'x is()', 'если x' достигнет того же. Почему вы действительно спрашиваете? –

+0

Существует множество возможных значений, для которых 'bool (x)' является 'False'. Мне нужно было проверить, был ли 'x' фактически'() ', а не одной из других возможностей, по той же причине, что вы используете' x is None '. –

+0

нет, если x является кортежем, 'isinstance (x, tuple)' также явно разрешит вам проверить, что x на самом деле является кортежем –

ответ

1

Нет, нет других встроенных типов, которые имеют одинарные значения. Единственным относительным из этих синглетонов является тип bool, который допускает два значения (а именно True и False) *.

В Python 2.x (я не могу найти их в 3.x) вы можете увидеть это ограничение импорта NotImplementedType, EllipsisType, NoneType из модуля types и понимают, что это явно не с его фантазии пользовательских TypeError:

In [13]: from types import NoneType 

In [14]: n = NoneType() 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-14-b386f51143fb> in <module>() 
----> 1 n = NoneType() 

TypeError: cannot create 'NoneType' instances 

() является к сожалению, не является уникальным, он представляет собой пустой кортеж, если тип Tuple был уникальным в том смысле, что NoneType является уникальным, тогда все его экземпляры потребуют иметь то же значение.


Если вы хотите, чтобы поближе взглянуть на них, они расположены в Objects/object.c в линиях 1351 и 1473 для None и NotImplemented соответственно. Эллипсис еще не найден.


* Update: По-видимому, True и False являются также одиночек, по PEP 285 - Adding a bool type:

Значения Ложные и истинные будут одиночек, как None. Потому что тип имеет два значения, возможно, их следует называть «doubletons»? Реальная реализация не позволит использовать другие экземпляры bool, которые будут созданы

1

За что стоит, () не является уникальным в PyPy 4.0.1:

>>>> x =() 
>>>> x is() 
False 
+1

Он особо упомянул о CPython. –

2

Ну ... вы можете думать о какой-либо глобальный объект как «уникальный» в том смысле, что всегда тот же объект.

Например:

>>> x = file 
>>> x is file 
True 
>>> x = True 
>>> x is True 
True 
>>> x = ZeroDivisionError 
>>> x is ZeroDivisionError 
True 

Существует ничего особенного:

>>> x = None 
>>> x is None 
True 

То, что вы, вероятно, интересно, почему вы должны проверить x is None, а не x == None.

Ответ: x == None будет вызывать x.__eq__(None), который может вернуться True во всех видах ситуаций, в которых x не на самом деле None (хотя на самом деле это не очень часто).

Экземпляры?

Ну, вы можете сказать, что есть разница: None - это пример.

Ну, на самом деле, все в Python - это объект, что означает, что все является экземпляром. В моих примерах, file и ZeroDivisionError являются экземплярами type, True является экземпляром bool и None является экземпляром NoneType (обратите внимание, что type является экземпляром type, так что нет никаких исключений из этого правила).

Существует одна специальная вещь None - это единственный экземпляр NoneType, и вы не можете заставить других (если нет какой-нибудь хороший трюк?)

Но что на самом деле это свойство NoneType - это не позволяет вы делаете новые экземпляры:

TypeError: cannot create 'NoneType' instances 

Но это не так важно для всей истории.

EDIT Эти "уникальный экземпляр-объекты" называются одиночек. Конечно, вы можете сделать некоторые из них.