V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
laoyur
V2EX  ›  Python

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

  •  
  •   laoyur · 2016-07-09 12:09:22 +08:00 · 2924 次点击
    这是一个创建于 3066 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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,)

    7 条回复    2016-07-09 14:19:50 +08:00
    lance6716
        1
    lance6716  
       2016-07-09 12:25:13 +08:00 via Android
    (None,): Python 语法
    tuple 那个没法试,没装 Django 。命令行下 Python 自己没有这个特性
    jiang42
        2
    jiang42  
       2016-07-09 12:29:08 +08:00 via iPhone
    我猜是 descriptor 里面做了些奇怪的事情
    laoyur
        3
    laoyur  
    OP
       2016-07-09 12:30:02 +08:00
    @lance6716 我知道(None,)这是个 Python 单元素元组的语法,我的问题是
    pf.qq 本来是 None ,为何 dic['qq'] = pf.qq 后, dic['qq']值就变成了(None,)?不应该是 None 嘛?
    zq9
        4
    zq9  
       2016-07-09 12:36:58 +08:00   ❤️ 5
    我猜你在语句后加了逗号, dic['email'] = pf.email,
    laoyur
        5
    laoyur  
    OP
       2016-07-09 12:42:17 +08:00
    @zq9 you are a superman !
    尼玛,我果然是新手,将一坨代码从 dict 字面定义中挪出来,加上按条件赋值时,忘记去掉后面的逗号了。。。
    IDE 也没提醒我,我一点都没注意到。。。
    lance6716
        6
    lance6716  
       2016-07-09 14:10:46 +08:00
    @laoyur 。。。我很好奇你网页上的代码为什么就去掉逗号了
    laoyur
        7
    laoyur  
    OP
       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 就能一看看出破绽来
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1431 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:29 · PVG 01:29 · LAX 09:29 · JFK 12:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.