Python 新手求助,为何一个新 item 加入到 dict 中,它的 value 会变成一个单元素元组

2016-07-09 12:09:22 +08:00
 laoyur

django 项目

UserProfile 定义:

class UserProfile(models.Model):
    easeim_username = models.CharField(null=True, unique=True, max_length=40)
    email = models.EmailField(blank=True, null=True, unique=True)
    qq = models.CharField(blank=True, null=True, max_length=32)

测试代码:

dic = {}
dic['im_username'] = pf.easeim_username # pf 是一个 UserProfile obj
dic['email'] = pf.email
dic['qq'] = pf.qq

调试截图:

pf 的 properties :

dic 的 items :

问题:

为何 dic['im_username']的值是 unicode 类型,而 dic['email']就变成了 tuple 类型了?同样还有 dic['qq'],为何会变成(None,)

2906 次点击
所在节点    Python
7 条回复
lance6716
2016-07-09 12:25:13 +08:00
(None,): Python 语法
tuple 那个没法试,没装 Django 。命令行下 Python 自己没有这个特性
jiang42
2016-07-09 12:29:08 +08:00
我猜是 descriptor 里面做了些奇怪的事情
laoyur
2016-07-09 12:30:02 +08:00
@lance6716 我知道(None,)这是个 Python 单元素元组的语法,我的问题是
pf.qq 本来是 None ,为何 dic['qq'] = pf.qq 后, dic['qq']值就变成了(None,)?不应该是 None 嘛?
zq9
2016-07-09 12:36:58 +08:00
我猜你在语句后加了逗号, dic['email'] = pf.email,
laoyur
2016-07-09 12:42:17 +08:00
@zq9 you are a superman !
尼玛,我果然是新手,将一坨代码从 dict 字面定义中挪出来,加上按条件赋值时,忘记去掉后面的逗号了。。。
IDE 也没提醒我,我一点都没注意到。。。
lance6716
2016-07-09 14:10:46 +08:00
@laoyur 。。。我很好奇你网页上的代码为什么就去掉逗号了
laoyur
2016-07-09 14:19:50 +08:00
@lance6716 因为源代码里面逻辑太乱,直接扒拉出来怕较难说清楚,主帖中的测试代码是我手动敲出来的。。。没想到恰恰是这个手动敲的动作,掩盖了真相

复制粘贴害死人,我原本是这样的逻辑:

dic = {
'uuid': pf.uuid,
'member_type': pf.member_type,
'nickname': pf.nickname,
'signature': pf.signature,
'avatar_index': pf.avatar_index,
}
其中某几个 item 需要改成按条件添加,所以直接剪切出来,放到了 if 中再改改改,万万妹想到后面还有个逗号,所以就出现了主帖中的现象,有些 item 的 value 是对的,有些又变成了 tuple

说到底,还是自己太年轻,像 4 楼的老司机 @zq9 就能一看看出破绽来

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/291323

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX