我想创建一个具有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