我们在代码中有一个NamedTuple,如下所示:
from typing import NamedTuple
class StandardParameters(NamedTuple):
offset: int
limit: int
locale: str这在使用Python3.6.6在./manage shell下导入此文件的本地机器上运行良好,在使用./manage runserver的本地服务器(macOS)上运行良好。
这在Ubuntu生产服务器上也可以很好地工作,使用./manage shell并导入这个文件。但是如果我们使用生产服务器的Django HTTP服务器,它在这个类定义上会失败,如下所示:
function() argument 1 must be code, not str Django错误响应表明它与我们在本地使用的Python版本相同,并通过./manage shell 3.6.6。但它无法将NamedTuple作为一个类进行评估。
果然,如果我添加raise Exception(str(NamedTuple)),那么在我们的本地系统上,它会记录“NamedTuple类”,但在Ubuntu HTTP服务器上,它会记录“NamedTuple函数”。这让我们觉得我们使用的是较旧版本的Python,但同样,返回的调试响应显示为3.6.6。
我们在代码中只有一个NamedTuple,它在Ubuntu服务器上工作。它是以“向后兼容”的形式使用的:
from typing import NamedTuple
ClientInfo = NamedTuple('ClientInfo', [
('client', Client),
('clientVersion', str),
('device', str),
('platform', Platform),
('platformVersion', str),
])这些会相互影响吗?即便如此,在Mac3.6.6和Ubuntu上,它会以一种不同的方式运行吗?在Ubuntu上,它会通过./manage shell接口来运行吗?
发布于 2019-03-21 08:51:14
您提供的错误消息和诊断输出表明您没有使用Python3.6标准库版本的typing模块。不知何故,您在Django服务器正在使用的虚拟环境中安装了旧版本的typing backport。卸载backport应该会隐藏typing的标准库版本,允许您使用Python3.6中引入的特性。
https://stackoverflow.com/questions/55250561
复制相似问题