我们在代码中有一个NamedTuple,例如:
from typing import NamedTuple
class StandardParameters(NamedTuple):
offset: int
limit: int
locale: str
这在使用Python 3.6.6在./manage shell
下导入此文件的本地计算机上运行良好,在使用./manage runserver
的本地服务器(macOS)上运行良好。
使用./manage shell
并导入此文件在Ubuntu生产服务器上也可以正常工作。但是,如果我们使用生产服务器的Django HTTP服务器,则该类在以下类定义上将失败:
function() argument 1 must be code, not str
Django错误响应表明它与我们在本地使用的版本相同,并且通过./manage shell
(3.6.6)使用。但是无法将NamedTuple
评估为全班。
当然,如果我添加raise Exception(str(NamedTuple))
,则在我们的本地系统上,它将记录“类NamedTuple”,但是在Ubuntu HTTP服务器上,它将记录“功能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),
])
它们会互相影响吗?即便如此,它在Mac上的3.6.6上以及在Ubuntu上通过./manage shell
的行为是否会是一种方式,而在通过HTTP接口在Ubuntu上的行为却会有所不同?
答案 0 :(得分:1)
您提供的错误消息和诊断输出表明您没有使用typing
模块的Python 3.6标准库版本。您已经以某种方式获得了Django服务器正在使用的virtualenv上安装的typing
backport的旧版本。卸载backport应该取消隐藏typing
的标准库版本,从而允许您使用Python 3.6中引入的功能。