2013-07-02 3 views
9

Я хотел бы создать класс, который наследует от None.Как наследовать от Python Нет

Пробовал так:

class InvalidKeyNone(None): 
    pass 

, но это дает мне:

TypeError: Error when calling the metaclass bases 
    cannot create 'NoneType' instances 

Что было бы правильным решением, которое дает мне тип, который ведет себя так же, как None но я могу напечатать тест?

foo = InvalidKeyNone() 
print(type(foo)) 
>>> InvalidKeyNone 

[EDIT]

Я хочу, чтобы это сделать, потому что я создаю схему выбора на datastructures Python:

bar = select(".foo.bar.[1].x", {"foo":{"bar":[{"x":1}, {"x":2}], "baz":3}) 
print(bar) 
>> 2 

И я хочу, чтобы иметь возможность определить, не получаю ли я None потому что выбранное значение равно None или потому, что ключ не найден. ОДНАКО, он должен вернуть (утаенный) Нет, который ведет себя точно так же, как Нет. Никакие исключения или пользовательский тип не возвращаются сюда.

[EDIT]

Итак, консенсус: не может быть сделано. Который, хотя и неудовлетворительный, является верным ответом. Так как я действительно хочу, чтобы поведение по умолчанию заставляло его возвращать None, когда ключ отсутствует, я думаю, что у меня будет выбор, который будет использовать параметр, чтобы переключиться на бросание исключительных ситуаций, когда это необходимо. Благодарю.

+10

Почему вы хотите сделать это? – karthikr

+0

Я так же удивлен, как karthikr, я не вижу смысла.Дайте нам дополнительную информацию об этом – Paco

+0

(Скорее всего) Вы не можете создать экземпляр, потому что 'None' является singleton – karthikr

ответ

16

None является constant, единственное значение types.NoneType (для v2.7, для v3.x)

Во всяком случае, когда вы пытаетесь наследовать от types.NoneType

from types import NoneType 

class InvalidKeyNone(NoneType): 
    pass 

foo = InvalidKeyNone() 
print(type(foo)) 

вы получите эту ошибку

Python 2

TypeError: Error when calling the metaclass bases type 'NoneType' is not an acceptable base type

Python 3

ImportError: cannot import name 'NoneType'

говоря короткое, вы не можете наследовать от NoneType

Во всяком случае, зачем нужен класс для наследования NoneType?

+0

В python 3 вы можете сделать: type (None), и он возвращает NoneType – les

+0

Я хотел был бы уметь наследовать от 'NoneType', например. для сбрасывания на YAML я бы имел несколько типов, которые все ведут себя как «Нет», но которые могут быть представлены разными способами в YAML ('NULL',' ~ ',' null', пустой скаляр и 'Null') – Anthon

3

Невозможно это сделать, по крайней мере, определенно, пока не сделаете какую-то нечитаемую черную магию.

Возможно, вы должны использовать исключения.

+1

Эта. Подкласс 'KeyError' и повысит ваш код вместо стандартного' KeyError'. –

10

Подклассификация Ничего не имеет смысла, так как это синглтон, и там может быть только один. Вы говорите, что хотите класс с таким же поведением, но у Ничего нет никакого поведения!

Если то, что вы действительно хотите это уникальный заполнитель, который вы можете вернуться из функции, чтобы указать специальный случай, то самый простой способ сделать это, чтобы создать уникальный экземпляр объекта:

InvalidKey = object() 

result = doSomething() 
if result is InvalidKey: 
    ... 
+0

Обратите внимание, что здесь разница состоит в том, что 'bool (None)' is 'False', тогда как' bool (InvalidKey) 'is' True' – Eric

+2

. Решением было бы создать экземпляр singleton настраиваемого класса с '__nonzero__', установленным для return false. –

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