Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 具有多重继承和元类定义的SyntaxError_Python 3.x_Multiple Inheritance_Metaclass - Fatal编程技术网

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以简化此过程,例如通过或类似的方式