python2.7和3.5相互兼容吗_以与Python 2.7和Python 3.5兼容的方式使用abc.ABCMeta

我想创建一个具有SyntaxError作为元类并与Python 2.7和Python 3.5兼容的类。 到目前为止,我仅在2.7或3.5上成功完成了此操作-但从未同时在两个版本上成功完成此操作。 有人可以帮我吗?

Python 2.7:

import abc

class SomeAbstractClass(object):

__metaclass__ = abc.ABCMeta

@abc.abstractmethod

def do_something(self):

pass

Python 3.5:

import abc

class SomeAbstractClass(metaclass=abc.ABCMeta):

@abc.abstractmethod

def do_something(self):

pass

测试中

如果我们使用合适版本的Python解释器(Python 2.7->示例1,Python 3.5->示例2)运行以下测试,则在两种情况下均成功:

import unittest

class SomeAbstractClassTestCase(unittest.TestCase):

def test_do_something_raises_exception(self):

with self.assertRaises(TypeError) as error:

processor = SomeAbstractClass()

msg = str(error.exception)

expected_msg = "Can't instantiate abstract class SomeAbstractClass with abstract methods do_something"

self.assertEqual(msg, expected_msg)

问题

使用Python 3.5运行测试时,不会发生预期的行为(实例化SomeAbstractClass时未引发SyntaxError):

======================================================================

FAIL: test_do_something_raises_exception (__main__.SomeAbstractClassTestCase)

----------------------------------------------------------------------

Traceback (most recent call last):

File "/home/tati/sample_abc.py", line 22, in test_do_something_raises_exception

processor = SomeAbstractClass()

AssertionError: TypeError not raised

----------------------------------------------------------------------

而使用Python 2.7运行测试会产生SyntaxError:

Python 2.7 incompatible

Raises exception:

File "/home/tati/sample_abc.py", line 24

class SomeAbstractClass(metaclass=abc.ABCMeta):

^

SyntaxError: invalid syntax

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值