gpt4 book ai didi

Python 2 & 3 与 `super` 的兼容性以及在 Py2 中为旧式但在 Py3 中变为新式的类

转载 作者:太空狗 更新时间:2023-10-30 01:29:15 28 4
gpt4 key购买 nike

我有a project它使用 SafeConfigParser 并且我希望它与 Python2 和 3 兼容。现在,SafeConfigParser 自 Python 3.2 以来已被弃用,我发现弃用警告很烦人。所以我着手解决这个问题。

首先(也是更早的,已经解决的问题):SafeConfigParser 是 Python2 中的旧式类,所以我不能在我的后代类中调用 super。为了获得更一致的行为,我写了以下内容:

try:
# Python 2
class ConfigResolverBase(object, SafeConfigParser):
"""
A default "base" object simplifying Python 2 and Python 3
compatibility.
"""
pass
except TypeError:
# Python 3
class ConfigResolverBase(SafeConfigParser):
"""
A default "base" object simplifying Python 2 and Python 3
compatibility.
"""
pass

如有必要,这可以很好地使类成为新样式。为了摆脱 DeprecationWarning,我将代码更改为:

if sys.hexversion < 0x030000F0:
# Python 2
class ConfigResolverBase(object, SafeConfigParser):
"""
A default "base" object simplifying Python 2 and Python 3
compatibility.
"""
pass
else:
# Python 3
class ConfigResolverBase(ConfigParser):
"""
A default "base" object simplifying Python 2 and Python 3
compatibility.
"""
pass

在此过程中,我还修复了之前错过更改的一行:

@@ -275,7 +276,7 @@ class Config(ConfigResolverBase):
have_default = False

try:
- value = SafeConfigParser.get(self, section, option, **kwargs)
+ value = super(Config, self).get(section, option, **kwargs)
return value
except (NoSectionError, NoOptionError) as exc:
if have_default:

并且那个改变导致了一个有趣的错误:

AttributeError: 'Config' object has no attribute '_sections'

这让我相信 ConfigParser__init__ 没有被调用。并且确实进行了以下更改修复了:

- class ConfigResolverBase(object, SafeConfigParser):
+ class ConfigResolverBase(SafeConfigParser, object):

我的代码现在可以在 Python 2 和 3 上正常工作,但我不确定的是:super 返回的代理是否始终相同?”在我的例子中,我继承自 objectSafeConfigParser。交换我的类定义中的两个基础使得 super 返回正确的基础。但这是否保证在所有 Python 实现中都是稳定的在所有平台上?还是我应该显式调用 SafeConfigParser.get(self, ...)?这毕竟是调用基础的“旧方法”...

最佳答案

是的,保证跨 Python 版本稳定。搜索顺序称为方法解析顺序或 MRO,此顺序自 Python 2.3 以来一直相同。

有关如何确定顺序的更多详细信息,请参阅 Python 2.3 Method Resolution Order documentation .

您可以通过查看给定类的 .__mro__ 属性来检查 MRO;它是按方法解析顺序排列的类元组。

关于Python 2 & 3 与 `super` 的兼容性以及在 Py2 中为旧式但在 Py3 中变为新式的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20886484/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com