Джанго неправильно понимает NamedTuple - PullRequest
1 голос
/ 20 марта 2019

У нас есть NamedTuple в коде, как:

from typing import NamedTuple

class StandardParameters(NamedTuple):
    offset: int
    limit: int
    locale: str

Это прекрасно работает на наших локальных машинах с использованием Python 3.6.6, импортируя этот файл под ./manage shell, и прекрасно работает на локальном сервере (macOS) с использованием ./manage runserver.

Это также отлично работает на рабочем сервере Ubuntu, используя ./manage shell и импортируя этот файл. Но если мы используем HTTP-сервер Django производственного сервера, он не работает в этом определении класса с:

function() argument 1 must be code, not str 

Ответ об ошибке Django указывает, что это та же версия Python, которую мы используем локально, и через ./manage shell, 3.6.6. Но он не может оценить NamedTuple как класс.

Конечно, если я добавлю raise Exception(str(NamedTuple)), то в наших локальных системах он регистрирует «class NamedTuple», но на HTTP-сервере Ubuntu он записывает «function NamedTuple». Это заставляет нас чувствовать, что мы используем более старую версию Python, но, опять же, возвращенный ответ DEBUG указывает на 3.6.6.

У нас есть только один другой NamedTuple в любом месте кода, и он работает на сервере Ubuntu. Используется в форме «обратной совместимости»:

from typing import NamedTuple

ClientInfo = NamedTuple('ClientInfo', [
    ('client', Client),
    ('clientVersion', str),
    ('device', str),
    ('platform', Platform),
    ('platformVersion', str),
])

Будут ли они взаимодействовать друг с другом? Несмотря на это, будет ли он вести себя в одном направлении на 3.6.6 на Mac и через ./manage shell на Ubuntu, но по-другому на Ubuntu через интерфейс HTTP?

1 Ответ

1 голос
/ 21 марта 2019

Предоставленные вами сообщения об ошибках и результаты диагностики указывают на то, что вы не используете стандартную библиотеку Python 3.6 версии модуля typing.Вы каким-то образом получили старую версию typing backport , установленную на virtualenv, который используется вашим сервером Django.При удалении бэкпорта должна отображаться стандартная версия библиотеки typing, позволяющая использовать функции, представленные в Python 3.6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...