Подтвердить что ты не робот

Как наследовать от Python Нет

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

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

class InvalidKeyNone(None):
    pass

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

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

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

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

[EDIT]

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

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

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

[EDIT]

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

4b9b3361

Ответ 1

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: ошибка при вызове баз метакласса     тип "NoneType" не является приемлемым базовым типом

Python 3

ImportError: невозможно импортировать имя "NoneType"

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

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

Ответ 2

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

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

InvalidKey = object()

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

Ответ 3

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

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