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
JCZ2MkKb5S8ZX9pq
V2EX  ›  Python

命名习惯问题,大家怎么起名的啊?从驼峰转到下划线好不适应啊……

  •  
  •   JCZ2MkKb5S8ZX9pq · 2019-10-25 12:04:41 +08:00 · 7158 次点击
    这是一个创建于 1891 天前的主题,其中的信息可能已经有所发展或是发生改变。

    驼峰

    • 输入便利、连续,习惯小指按 shift,而且即便不大写,ide 也会自动补完已有的名称。
    • 省一个格子,pep8 一行 79-80 个字符限制,下划线多占一个格子。

    下划线

    • 变量名看起来稍微清楚一点(但读惯了驼峰也还好)
    • 公认的 python 命名方式(真的是最近才知道)
    • 输入下划线,有时候会按错键,还没适应。

    • 反正努力在适应下划线,但还是想吐槽一下。
    • 另外大家全局变量,Class,一般命名习惯是怎么样的呢?
      比如我搞个类 Timer 计时,调用的时候习惯缩写 tmr。大家这方面怎么区分的呢?
      另外包和包里的函数,功能如果差不多的话(我不习惯把太多功能放到一个包里,都拆分了),import 的时候就显得很重复。命名上大家习惯怎么区分呢?
    • Python 风格规范 — Google 开源项目风格指南 我看这篇,感觉除了 Class 和 Constants,其它也都差不多啊。
    第 1 条附言  ·  2019-10-25 12:37:16 +08:00

    另外补充下类似 Class Timer() 的问题。

    • 如果我写tmr=Timer(),甚至我这边有些老程序员朋友会写tm,虽然易区分,但长期来看并不易读。
    • 但我如果写timer=Timer(),又感觉区分得不是太明显。
    • 或者在调用的时候用timer,类名再搞特殊点?

    大家习惯怎么处理这类命名呢?

    38 条回复    2019-10-27 16:47:51 +08:00
    okwork
        1
    okwork  
       2019-10-25 12:11:48 +08:00 via Android
    py 里面也有驼峰,是留给类名用的
    ClericPy
        2
    ClericPy  
       2019-10-25 12:15:03 +08:00   ❤️ 1
    Python 又不是 go, 想驼峰就驼峰呗, 用 go 的时候 linter 直接告诉我别用下划线, 每次大小写按 shift 按的想死... 左 shift 右 shift.... 如果下划线, 只按左 shift 就够了, 而且驼峰有些 is of 什么的真不喜欢大写....
    ayase252
        3
    ayase252  
       2019-10-25 12:22:29 +08:00
    by73
        4
    by73  
       2019-10-25 12:29:30 +08:00
    难道大家都不用 IDE 补全的么?无论驼峰还是下划线,基本都只是在定义的时候用一次,后面直接全小写不带下划线也可以直接提示出来。
    JCZ2MkKb5S8ZX9pq
        5
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-25 12:29:30 +08:00
    @okwork 类名是首字大写吧,我说的是小驼峰,第一个首字小写的…… 以前落下的习惯
    JCZ2MkKb5S8ZX9pq
        6
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-25 12:31:11 +08:00
    @ClericPy 打字习惯我倒还好,左右 shift 双持,英文写作速度还行。所以反而很少用下划线。
    lc7029
        7
    lc7029  
       2019-10-25 12:31:32 +08:00   ❤️ 3
    汉字变量名,完事了
    lc7029
        8
    lc7029  
       2019-10-25 12:31:50 +08:00   ❤️ 1
    @lc7029 补充,数据库名,数据库字段名也用汉字
    JCZ2MkKb5S8ZX9pq
        9
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-25 12:35:06 +08:00
    @lc7029 大哥你认真的吗?
    lc7029
        10
    lc7029  
       2019-10-25 12:36:12 +08:00   ❤️ 1
    @JCZ2MkKb5S8ZX9pq 认真的,python 和 mysql 支持为什么不能用
    cquan
        11
    cquan  
       2019-10-25 12:39:03 +08:00
    一直用驼峰( ̄▽ ̄)"
    JCZ2MkKb5S8ZX9pq
        12
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-25 12:43:33 +08:00
    @cquan 要考虑为将来团队协作做准备啊 我也是最近才开始转
    JCZ2MkKb5S8ZX9pq
        13
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-25 12:45:41 +08:00
    @lc7029 python 我个人不习惯用中文命名,注释和 log 有时候会写中文。
    数据库的话真的不行,mongodb 里 key 是重复占空间的,大点的库恨不得映射一套缩写。。。
    xuanwu
        14
    xuanwu  
       2019-10-25 12:59:12 +08:00
    +1 @lc7029。最近的大疆机甲大师也用了中文 Python: https://www.v2ex.com/t/612749#reply0

    中文命名风格可以复用于多种语言(自己用过的有 Java,JS, TS,SQL 等),比如要区分类名的话加个后缀"XX 类“。下划线、驼峰都不需要,也是中文的一个优势。
    otakustay
        15
    otakustay  
       2019-10-25 14:29:56 +08:00
    @ClericPy 为什么驼峰要右边的 Shift……
    fancy111
        16
    fancy111  
       2019-10-25 14:35:41 +08:00
    不要纠结命名,差不多能看懂就行。
    搞不懂说考虑团队协作的,难道你们是机器人吗?
    Immortal
        17
    Immortal  
       2019-10-25 14:39:04 +08:00
    我习惯是:
    1 脚本下划线 静态语言
    2 小驼峰 ,因为 go 大小写涉及到作用域,导出类型只能大驼峰
    ClericPy
        18
    ClericPy  
       2019-10-25 15:48:26 +08:00
    @otakustay 小学的键盘指法教学... shift 要用离次要键位远的那一个, 符合人体工...

    我不反感左手按 shift 也是近 20 年苦练 cs 的成果

    @JCZ2MkKb5S8ZX9pq 因为你以前驼峰按的多了, 自然舒服, 我现在也在强制练习了

    反正对 Python 来说, 讲的就是一个灵活, 在灵活的基础上, 一定要保证前后一致, 这样会避免很多小毛病.
    wangyzj
        19
    wangyzj  
       2019-10-25 15:58:30 +08:00
    python 我习惯蛇形
    其他的驼峰
    classyk
        20
    classyk  
       2019-10-25 17:08:28 +08:00   ❤️ 1
    最近代码看多了,觉得汉字变量名真 TMD 好。
    驼峰有些也看着不舒服,下划线输入起来麻烦而且长
    反正没有完美的解决方式。
    cexia
        21
    cexia  
       2019-10-25 17:47:51 +08:00
    既然提到 PEP8 了,那就按照 PEP8 里的规范做呗。
    什么场景驼峰,什么场景下划线,都明确写了啊。
    本来就是根据口味来的东西。日常工作若是要统一口味,我跟 PEP8。
    ClarkAbe
        22
    ClarkAbe  
       2019-10-25 18:56:40 +08:00 via Android
    一个单词全小写,多个单词驼峰,超长下划线
    EscYezi
        23
    EscYezi  
       2019-10-25 20:06:40 +08:00 via iPhone
    主力 java 的路过,之前写 python 脚本写到一半才发现用的驼峰,索性继续驼峰了,看着比较顺眼(
    变量名个人比较注重描述清楚这个变量的作用,长一点没关系,大三的时候汇编课被老师吐槽写的太啰嗦🤣
    timer 那个如果我担心自己搞不清,甚至会写成 timerObj
    EscYezi
        24
    EscYezi  
       2019-10-25 20:08:55 +08:00 via iPhone
    @EscYezi #22 或者根据 timer 的实际作用,比如 sortTimer
    noobsheldon
        25
    noobsheldon  
       2019-10-25 20:12:26 +08:00 via Android
    #noqa
    byfar
        26
    byfar  
       2019-10-25 20:23:28 +08:00
    go: 驼峰
    rust: 下划线
    python: 下划线

    写代码时自动切换的路过
    sazima
        27
    sazima  
       2019-10-25 20:32:06 +08:00
    代码里警告太多影响美观
    JCZ2MkKb5S8ZX9pq
        28
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-25 22:13:23 +08:00
    @EscYezi 或者考虑到 timer 复用次数比较多,宁可 class 的命名复杂一点长一点。
    koebehshian
        29
    koebehshian  
       2019-10-25 22:58:48 +08:00
    类名用形容词,变量用名词,函数名用动词
    akira
        30
    akira  
       2019-10-25 23:11:23 +08:00
    大小写敏感的语言 用驼峰写的代码看起来好累 眼睛都要看花了
    oneisall8955
        31
    oneisall8955  
       2019-10-26 14:30:28 +08:00
    Java 习惯用驼峰,类 shell 脚本习惯用下划线
    nightwitch
        32
    nightwitch  
       2019-10-26 17:46:23 +08:00
    C++变量驼峰,函数用下划线,和 stl 的风格保持一致
    python 照 pep8 的风格来
    secondwtq
        33
    secondwtq  
       2019-10-26 18:12:13 +08:00
    如果在这两者之间摇摆不定,不如结合起来一块用吧

    OCaml 一般是用 underscore 的,但是语法要求一些结构(比如 Constructor 和 Module )必须以大写字母开头(语法强制的哦),于是就出现了这种 https://github.com/ocaml/ocaml/blob/79f1c734621ea75bfacaed9ea20ebef7479194b2/typing/env.ml#L77 “首字母大写的 underscore”
    secondwtq
        34
    secondwtq  
       2019-10-26 18:39:04 +08:00
    另一个有意思的现象(和楼主的 append 有点关系),C/C++ 其实是没有官方推荐的变量命名规范的(可能是有,但是就算有也没法 mandate ),每个项目的规范都不太一样
    于是 LLVM 一开始用了以 camelcase 为主的命名方案,具体来说是类型名,变量名(包括局部变量和成员变量),用 UpperCamelCase,函数名是 lowerCamelCase。
    但是后来发现一个问题,比如我有一个变量的类型是 MemorySSAUpdater,那么按照命名规范,我不能把它命名成 MemorySSAUpdater,因为会和类型名冲突,现在的解决方案是取首字母 acronym 命名成 MSSAU。这种情况在整个仓库里十分广泛: https://github.com/llvm/llvm-project/blob/734c74ba14be0f4421ccd9f720e5b9309248e0f7/llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp#L709 感受一下
    但是这种命名多了就会十分奇怪,看代码必须先要熟悉这些奇怪的缩写才能看得下去

    于是现在有个 proposal 就是把变量命名从 UpperCamelCase 变成 lowerCamelCase,这样我就直接命名成 memorySSAUpdater 就行了: https://llvm.org/docs/Proposals/VariableNames.html

    不过 acronym 不能完全避免,任何一个专业领域都少不了 acronym,像什么 AST,CFG,BB,SCEV 之类的出现在编译器的代码中其实都正常,这些东西在学术界和工业界都有认知,问题对于一个项目来讲,很多类是项目独有的,写 acronym 就会让人摸不到头脑,至于 Loop 的变量名写成 L 之类的更是没啥必要
    JCZ2MkKb5S8ZX9pq
        35
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-26 22:40:11 +08:00
    @secondwtq 是的,所以我现在暂时是这么考虑的。
    class 调用之后的名字,使用比较广泛,所以这个尽量缩减。
    在我的例子里,这个就是 timer。
    然后类名称就长一点具体一点,再加上大写以区分了。

    然后有些类我作为全局量在用,统一配置在 config/setting 里,调用就暂时就全大写了,类似常量(这个还有点犹豫)。
    比如一些目录的设置,或者一些网址,需要根据账号等参数计算,就统一放在一个类里了。
    然后使用时的名称就暂时用全大写 PATH.product_image(pid) or PATH.brand_list(bid)
    但这样其实又不符合常量用全大写的规范,但是 path/url/account 这类词用小写又太容易跟局部变量撞车了,起太长又不大方便。

    ---

    另外首字大写+下划线的话,在几个指导文档里,是作为反面典型的。。。/捂脸
    lolizeppelin
        36
    lolizeppelin  
       2019-10-27 09:40:08 +08:00 via Android
    python 使用下划线源自于 linux c 代码风格

    习惯这种风格以后看 linux 里相关 c 代码比较舒服
    Nick66
        37
    Nick66  
       2019-10-27 12:02:58 +08:00
    遵循所写语言的规范,不要自己创造规范
    jin7
        38
    jin7  
       2019-10-27 16:47:51 +08:00
    把限制从 80 改成 120 ~~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2741 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 14:47 · PVG 22:47 · LAX 06:47 · JFK 09:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.