【问题标题】:Python abc.abstractproperty compatibilityPython abc.abstractproperty 兼容性
【发布时间】:2019-06-04 03:02:50
【问题描述】:

Python 3 文档提到 abc.abstractproperty 自 3.3 起已弃用,取而代之的是 @property@abstractmethod。是否有另一种方法来实现与 Python 2 和 3 兼容的抽象属性(没有 abc.abstractproperty)?

我试过了

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()

在 Python 3 中正确引发 TypeError: Can't instantiate abstract class C with abstract methods x,但在 Python 2 中却没有。

【问题讨论】:

  • 您可以在 utils 模块中将其定义为:lambda f: property(abstractmethod(f))。 AFAICT 既没有 six 也没有 future 定义兼容性函数。请注意,虽然 abstractproperty 已被弃用,但当前所有 python 版本都支持它。我相信它可能会在几年后的python4.0中被删除。你真的需要你的库的当前版本在未来几年与未来版本的 python 兼容吗?
  • 它从 3.3 开始就被弃用了,现在我们有了 3.7,所以我认为是时候了……但如果它一直持续到 Python 4 就可以了。您建议的 lambda 解决方案在 Python 2 中不起作用(如果您忘记在 C 中实现属性 x,不会引发异常)

标签: python python-3.x python-2.7 abc


【解决方案1】:

我知道这需要你导入 ABC,但你为什么不使用 try except。

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

我在问题的 cmets 中从@Giacomo Alzetta 借用了 python3 解决方案。

【讨论】:

    猜你喜欢
    • 2018-06-02
    • 1970-01-01
    • 2010-09-14
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多