SyntaxError с множественным наследованием и определением метакласса - PullRequest
0 голосов
/ 12 июля 2020

У меня действительно странная ошибка. В моем проекте используется следующий сегмент кода:

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
   
      ...
      ...

Когда я запускаю с Python 3.5 в macOS, он работает. Однако, когда я переношу проект на 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) верное. . Что здесь может быть не так?

1 Ответ

2 голосов
/ 12 июля 2020

Я почти уверен, что вы действительно используете Python 2 на своей машине с Ubuntu. Под Python 2 метаклассы были установлены с использованием a __metaclass__ атрибута . Метаклассы в стиле ключевых слов были добавлены в Python 3.0 .

В зависимости от того, как вы установили Python, вам может потребоваться вызвать свой код, используя python3 или даже python3.6, а не python. Обратите внимание, что по умолчанию python в Ubuntu 18.04 по-прежнему имеет версию 2.7 .

Я предлагаю вам настроить virtualenv с правильной версией, чтобы упростить это, например, через venv модуль или что-то вроде Pipenv .

...