У нас есть 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?