V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Marsss
V2EX  ›  问与答

Python 变量命名带类型标识是否合理

  •  
  •   Marsss · 2019-04-30 09:48:43 +08:00 · 3022 次点击
    这是一个创建于 2041 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一般来说 python 变量的命名规则是 lower_with_under,这里不是想讨论这个规则,而是想讨论如何让命名更容易被理解。

    我看到有些规范里提到: 变量名不应带有类型信息,因为 Python 是动态类型语言。如 iValue、names_list、dict_obj 等都是不好的命名。

    但是我感觉这样有点不太合理,有些变量如果带上 names_list,这样更容易被理解。而且在谷歌版本的 python 规范中,在正确的示例代码里也出现了这样的命名。

    那么大家觉得 name_list 类似这样的命名是否合理呢?

    9 条回复    2019-04-30 12:38:40 +08:00
    zhucegeqiu
        1
    zhucegeqiu  
       2019-04-30 10:08:32 +08:00
    我一般用 names,因为没准哪天就不用 list 改用 set 或者别的数据结构了
    Kiriz
        2
    Kiriz  
       2019-04-30 10:16:30 +08:00
    def foo(a: int, b: List[int]) -> bool
    感觉这样就差不多了 关键地方写点注释应该还行
    变量名强制带类型还是不习惯
    dacapoday
        3
    dacapoday  
       2019-04-30 10:18:43 +08:00
    与其说是类型,不如说是在声明这些变量名表示容器。不带类型信息也许是指变量名的语义能够像静态类型中的泛型一样使用。
    Vinty
        4
    Vinty  
       2019-04-30 10:19:23 +08:00
    动态类型语言的意思是编译器不知道类型,而不是人不知道类型吧
    PEP8 并没有找到这条规范,中文规范基本都是抄的同一篇
    wwqgtxx
        5
    wwqgtxx  
       2019-04-30 10:27:23 +08:00 via iPhone
    反正我自己写经常是 xxx_list xxx_dict 倒是不用 xxx_obj 这种,只要 pep8 没说不建议使用就无所谓了,其他规范就不用看了
    anonymous256
        6
    anonymous256  
       2019-04-30 10:30:26 +08:00
    "因为 Python 是动态类型语言。如 iValue、names_list、dict_obj 等都是不好的命名", 好奇有人经常会把一个变量弄成多种完全不同的变量类型吗? 大多数时候, 命名的一个变量, 就是期望它一个确定的类型. 比如像你想定义一个列表, temp = [], 难道在后面你还会把它当成 dict 去使用? 即便写成 temp_list 也没什么问题.

    但是有种情况可能例外, 如果一个变量作为函数的入参, 它存在多种可能的类型, 也意味着通常要用 isinstance()进行类型判断吧.

    正式因为动态语言,缺少了类型检查, 可能会引入一些错误, 或者其它同事看函数的时候不能一眼就知道函数参数和返回值的类型, 又或者后期自己维护的时候, 连变量的类型都不知道了. 就我个人而言, 我更习惯于使用 type hints 避免这些问题. https://docs.python.org/3/library/typing.html
    youngce
        7
    youngce  
       2019-04-30 10:40:13 +08:00
    这其实是一个编码风格问题,如果贵司的小伙伴都能做到所有的 list 对象的命名都是 XXX_list,dict 对象都是 XXX_dict,甚至遵守 XXX_int、XXX_str,全部统一。其实是不错的,但是几乎很难- -所以你要是 不能始终如一,这样写确实意义不大
    Marsss
        9
    Marsss  
    OP
       2019-04-30 12:38:40 +08:00
    好吧,其实只是为了增加代码的可读性,大概也只有 list 类型的变量,倾向于在命名里标注一下,表示这个变量是一个序列,其他代码在使用的时候可读性可能会好点,比如 for x in xxx_list 、xxx not in xxx_list 之类的,其他类型的变量确实没什么必要。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1074 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 23:29 · PVG 07:29 · LAX 15:29 · JFK 18:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.