Django误解了NamedTuple

时间:2019-03-19 21:55:23

标签: python django

我们在代码中有一个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上的行为却会有所不同?

1 个答案:

答案 0 :(得分:1)

您提供的错误消息和诊断输出表明您没有使用typing模块的Python 3.6标准库版本。您已经以某种方式获得了Django服务器正在使用的virtualenv上安装的typing backport的旧版本。卸载backport应该取消隐藏typing的标准库版本,从而允许您使用Python 3.6中引入的功能。