Python 3.x 具有多重继承和元类定义的SyntaxError
我遇到了一个非常奇怪的错误。我的项目涉及以下代码段:Python 3.x 具有多重继承和元类定义的SyntaxError,python-3.x,multiple-inheritance,metaclass,Python 3.x,Multiple Inheritance,Metaclass,我遇到了一个非常奇怪的错误。我的项目涉及以下代码段: from contextlib import contextmanager from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, scoped_session class Singleton(type): _instances = {} def __call__(cls, *args, **kwargs):
from contextlib import contextmanager
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
def get_instance(cls):
return cls._instances[cls]
class SessionManager(object, metaclass=Singleton):
_engines = {}
_db_config = {}
def __init__(self, db_config: dict, **kwargs):
"""
Parent initializer. Takes SQLAlchemy database config parameters.
:param db_config: Database config, consisting of known SQLAlchemy
config key/values
:type db_config: dict
:return: self
"""
self._engine = None
self._engine_string = None
self._db_config = db_config
...
...
当我在macOS中运行Python3.5时,它正在工作。但是,当我将项目迁移到Ubuntu 18.04并使用Python 3.6运行时,它会抱怨语法错误:
Traceback (most recent call last):
File "run.py", line 5, in <module>
from views import default
File "/home/john/p/a/views/default.py", line 11, in <module>
from utils.TaskManagerQueue import TaskManagerQueue
File "/home/john/p/a/utils/TaskManagerQueue.py", line 5, in <module>
from utils.SessionManager import SessionManager
File "/home/john/p/a/utils/SessionManager.py", line 19
class SessionManager(object, metaclass=Singleton):
^
SyntaxError: invalid syntax
回溯(最近一次呼叫最后一次):
文件“run.py”,第5行,在
从视图导入默认值
文件“/home/john/p/a/views/default.py”,第11行,在
从utils.TaskManagerQueue导入TaskManagerQueue
文件“/home/john/p/a/utils/TaskManagerQueue.py”,第5行,在
从utils.SessionManager导入SessionManager
文件“/home/john/p/a/utils/SessionManager.py”,第19行
类SessionManager(对象,元类=单例):
^
SyntaxError:无效语法
我在网上搜索并确认了类multi-heritation
classsessionmanager(object,metaclass=Singleton)
是正确的。这里可能出了什么问题?我很确定您实际上在Ubuntu机器上使用的是Python 2。在Python2下,元类是使用设置的。是的
根据安装Python的方式,可能需要使用python3
甚至python3.6
,而不是Python
调用代码。请注意
我建议您使用正确的版本设置一个virtualenv来简化此过程,例如通过或类似的方式。我很确定您在Ubuntu机器上实际使用的是Python 2。在Python2下,元类是使用设置的。是的 根据安装Python的方式,可能需要使用
python3
甚至python3.6
,而不是Python
调用代码。请注意
我建议您使用正确的版本设置virtualenv以简化此过程,例如通过或类似的方式