首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >姜戈误解了NamedTuple

姜戈误解了NamedTuple
EN

Stack Overflow用户
提问于 2019-03-20 05:55:23
回答 1查看 78关注 0票数 1

我们在代码中有一个NamedTuple,如下所示:

代码语言:javascript
复制
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服务器,它在这个类定义上会失败,如下所示:

代码语言:javascript
复制
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服务器上工作。它是以“向后兼容”的形式使用的:

代码语言:javascript
复制
from typing import NamedTuple

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

这些会相互影响吗?即便如此,在Mac3.6.6和Ubuntu上,它会以一种不同的方式运行吗?在Ubuntu上,它会通过./manage shell接口来运行吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-21 08:51:14

您提供的错误消息和诊断输出表明您没有使用Python3.6标准库版本的typing模块。不知何故,您在Django服务器正在使用的虚拟环境中安装了旧版本的typing backport。卸载backport应该会隐藏typing的标准库版本,允许您使用Python3.6中引入的特性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55250561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档