【问题标题】:SyntaxError with multi-inheritance and metaclass definition具有多重继承和元类定义的 SyntaxError
【发布时间】:2020-11-01 18:21:56
【问题描述】:

我遇到了一个非常奇怪的错误。我的项目涉及以下代码段:

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 中使用 Python 3.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

我在网上搜索过,确认类多继承class SessionManager(object, metaclass=Singleton)是正确的。这里有什么问题?

【问题讨论】:

    标签: python-3.x multiple-inheritance metaclass


    【解决方案1】:

    我很确定您实际上是在您的 Ubuntu 机器上使用 Python 2。在 Python 2 下,元类是使用 a __metaclass__ attribute 设置的。 Keyword-style metaclassesadded in Python 3.0

    根据您安装 Python 的方式,您可能需要使用 python3 甚至 python3.6,而不是 python 来调用您的代码。注意default python in Ubuntu 18.04 is still version 2.7.

    我建议您设置一个具有正确版本的 virtualenv 以简化此操作,例如通过the venv modulePipenv 之类的。

    【讨论】:

      猜你喜欢
      • 2012-03-04
      • 2020-02-17
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      • 2014-11-15
      • 2019-12-12
      相关资源
      最近更新 更多