Python abc.abstractproperty совместимость - PullRequest
0 голосов
/ 09 января 2019

В документации Python 3 упоминается, что abc.abstractproperty устарела с версии 3.3 в пользу @property и @abstractmethod. Есть ли альтернативный способ реализации абстрактного свойства (без abc.abstractproperty), совместимого как с Python 2, так и с 3?

Я пытался

import abc
from future.utils import with_metaclass

class Base(with_metaclass(abc.ABCMeta, object)):
    @property
    @abc.abstractmethod
    def x(self):
        raise NotImplementedError

class C(Base):
    pass

C()

, который правильно вызывает TypeError: Can't instantiate abstract class C with abstract methods x в Python 3, но не в Python 2.

1 Ответ

0 голосов
/ 08 июля 2019

Я знаю, что для этого требуется импортировать ABC, но почему бы вам не попробовать, кроме.

import abc
try:
    ABC = abc.ABC
    abstractproperty = lambda f: property(abc.abstractmethod(f))
except AttributeError:  # Python 2.7, abc exists, but not ABC
    ABC = abc.ABCMeta("ABC", (object,), {"__slots__": ()})
    from abc import abstractproperty

Я заимствую решение python3 от @Giacomo Alzetta в комментариях к вопросу.

...