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

写枚举类,哪种对齐方式比较好?

  •  
  •   XueXianqi · 2023-07-19 14:18:48 +08:00 · 2307 次点击
    这是一个创建于 498 天前的主题,其中的信息可能已经有所发展或是发生改变。

    方式 1:

    • 普通的方式,但是不一定会整整齐齐(因为每个变量名长度不一定一致)
    class Action(XIntegerChoices):
        """ 动作 枚举类 """
    
        CREATE = 0, "创建"
        DELETE = 1, "删除"
        UPDATE = 2, "修改"
        RETRIEVE = 3, "查看"
        LIKE = 4, "点赞"
        FOLLOW = 5, "关注"
        COLLECT = 6, "收藏"
        REGISTER = 7, "注册"
        LOGIN = 8, "登录"
        SEND = 9, "发送"
        CANCEL = 10, "取消"
    

    方式 2:

    • 强制对齐,但是可能会不符合代码规范,会引发 PEP 8: E221 multiple spaces before operator(所以最后用 # noqa 来使 IDE 不检查,从而不飘黄)
    class Action(XIntegerChoices):
        """ 动作 枚举类 """
    
        CREATE   = 0,  "创建"  # noqa
        DELETE   = 1,  "删除"  # noqa
        UPDATE   = 2,  "修改"  # noqa
        RETRIEVE = 3,  "查看"  # noqa
        LIKE     = 4,  "点赞"  # noqa
        FOLLOW   = 5,  "关注"  # noqa
        COLLECT  = 6,  "收藏"  # noqa
        REGISTER = 7,  "注册"  # noqa
        LOGIN    = 8,  "登录"  # noqa
        SEND     = 9,  "发送"  # noqa
        CANCEL   = 10, "取消"  # noqa
    
    31 条回复    2023-07-28 10:00:11 +08:00
    chaoshui
        1
    chaoshui  
       2023-07-19 14:30:44 +08:00   ❤️ 1
    老老实实第一种
    zqguo
        2
    zqguo  
       2023-07-19 14:47:14 +08:00
    第二种不知道有啥好?强行工整?
    vicalloy
        3
    vicalloy  
       2023-07-19 14:47:24 +08:00   ❤️ 2
    在 precommit 里设置代码提交前用 black 自动格式化。
    没必要在这类无关紧要的地方折腾。
    XueXianqi
        4
    XueXianqi  
    OP
       2023-07-19 14:55:07 +08:00
    @chaoshui 好嘞
    XueXianqi
        5
    XueXianqi  
    OP
       2023-07-19 14:59:38 +08:00
    @zqguo

    我是看一些第三方库的时候看到这种 “强行工整” 的枚举类写法

    colorma.ansi.py 第 49 行


    class AnsiFore(AnsiCodes):
    BLACK = 30
    RED = 31
    GREEN = 32
    YELLOW = 33
    BLUE = 34
    MAGENTA = 35
    CYAN = 36
    WHITE = 37
    RESET = 39

    (复制过来可能没对齐,可以忽略...)

    然后就在想,有没有必要这样
    XueXianqi
        6
    XueXianqi  
    OP
       2023-07-19 15:00:19 +08:00
    @vicalloy 确实,这样有点吹毛求疵了
    mainjzb
        7
    mainjzb  
       2023-07-19 15:03:37 +08:00
    🤣go 会强制对齐。希望其他语言能学习。
    busier
        8
    busier  
       2023-07-19 15:10:32 +08:00
    这样的操作,塞到数组里面不行么!!!
    hello00001
        9
    hello00001  
       2023-07-19 15:13:41 +08:00
    ctrl + alt + l
    asmoker
        10
    asmoker  
       2023-07-19 15:23:03 +08:00
    换 go ,go 是第二种 🤨
    XueXianqi
        11
    XueXianqi  
    OP
       2023-07-19 15:23:12 +08:00
    @hello00001 格式化代码,肯定是默认的第一种的...
    XueXianqi
        12
    XueXianqi  
    OP
       2023-07-19 15:23:51 +08:00
    @asmoker 对的,Go 是第二种,格式化就会直接变成第二种!
    lysS
        13
    lysS  
       2023-07-19 15:24:38 +08:00
    肯定是第二种啊
    joApioVVx4M4X6Rf
        14
    joApioVVx4M4X6Rf  
       2023-07-19 15:39:44 +08:00
    有什么格式化方法能把代码格式化成第二种
    Leviathann
        15
    Leviathann  
       2023-07-19 15:48:12 +08:00
    然后新加一个名字更长的整个文件 git 全改是吧
    wuwukai007
        16
    wuwukai007  
       2023-07-19 16:00:25 +08:00
    class Choices:
    def __init__(self, value, name):
    self._value = value
    self._name = name

    @property
    def value(self):
    return self._value

    @property
    def name(self):
    return self._name

    def __eq__(self, other):
    return self._value == other

    def __ne__(self, other):
    return not self.__eq__(other)


    class Action:
    """ 动作 枚举类 """
    CREATE = Choices(0, "创建")
    DELETE = Choices(1, "删除")


    # 使用
    x = 0

    # 判断值
    if x == Action.CREATE:
    print("匹配创建操作")

    # 获取名称
    print(Action.CREATE.name)
    XueXianqi
        17
    XueXianqi  
    OP
       2023-07-19 16:26:07 +08:00
    @v2exblog 目前我不知道,我是手动改的
    XueXianqi
        18
    XueXianqi  
    OP
       2023-07-19 16:40:08 +08:00
    @wuwukai007
    谢谢~
    我也自己封装过枚举基类,康康我的这个写得怎么样:
    https://gitee.com/xuexianqi/x_utils/blob/master/enum_utils/base.py
    XueXianqi
        19
    XueXianqi  
    OP
       2023-07-19 16:45:07 +08:00
    @Leviathann 确实,方式 2 对 git 不太友好,牵一发而动全身
    zqguo
        20
    zqguo  
       2023-07-19 16:59:52 +08:00
    @XueXianqi #5 个人觉得没太必要,正常写就好
    ruanimal
        21
    ruanimal  
       2023-07-19 17:21:16 +08:00
    话说你这个 tuple 不加括号,有点恶心
    XueXianqi
        22
    XueXianqi  
    OP
       2023-07-19 17:32:01 +08:00
    @ruanimal
    这个是参考 Django 的枚举类: https://docs.djangoproject.com/zh-hans/4.2/ref/models/fields/#enumeration-types
    其他的一些枚举类也有部分是如此,是隐式的
    对于新手来说确实不够友好...
    apake
        23
    apake  
       2023-07-19 19:15:44 +08:00
    第二种看的更清楚, 更省脑子. 所以第二种.
    kingcanfish
        24
    kingcanfish  
       2023-07-20 00:42:26 +08:00
    来写 golang 你就不会有这个烦恼了
    justdoit123
        25
    justdoit123  
       2023-07-20 10:38:03 +08:00
    没调教出格式化工具,就老老实实用第一种。
    iosyyy
        26
    iosyyy  
       2023-07-20 11:16:21 +08:00
    在这两种对齐方式中,第一种方式(方式 1 )通常比第二种方式(方式 2 )更受推荐,原因如下:

    可读性:第一种方式允许变量名的长度自然变化,使得代码更易读和理解。当变量名长度不一致时,对齐会导致外观上不够整齐,但通常更直观和美观。

    代码规范:第一种方式符合 PEP 8 代码风格指南,这是 Python 代码的官方风格指南。PEP 8 建议避免在赋值等号(在这种情况下)之前使用多个空格。虽然第二种方式尝试通过 # noqa 来忽略代码检查警告,但最好在可能的情况下避免与代码规范冲突。

    可维护性:如果未来添加或修改变量,第一种方式会自动适应变化,而第二种方式可能需要手动调整对齐,如果不仔细处理可能引入错误。

    一致性:第一种方式更符合典型的 Python 代码风格,遵循大多数 Python 项目中使用的标准缩进做法。

    总体而言,通常更应该优先考虑可读性、可维护性和代码规范,而不是严格的对齐。第一种方式允许灵活处理变量名长度,同时提供更干净、符合标准的代码风格。
    iosyyy
        27
    iosyyy  
       2023-07-20 11:16:32 +08:00
    @iosyyy chatgpt
    XueXianqi
        28
    XueXianqi  
    OP
       2023-07-20 11:59:51 +08:00
    @mistkafka 确实,一语中的,第二种得手动格式化,成本较高,git 不友好
    iorilu
        29
    iorilu  
       2023-07-20 13:24:20 +08:00 via Android
    这代码是用什么框架吗
    XueXianqi
        30
    XueXianqi  
    OP
       2023-07-20 13:39:52 +08:00
    @iorilu
    这个代码不依赖于框架。
    可以单独提出来用,也可以用在 Django 、Flask 、FastAPI 里面(例如 Django 的 Model 的 choices )

    这是自己封装的枚举基类:
    https://gitee.com/xuexianqi/x_utils/blob/master/enum_utils/base.py
    l4ever
        31
    l4ever  
       2023-07-28 10:00:11 +08:00
    何必纠结这些, IDE 说了算, 一保存就自动格了.
    管你嘞
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1670 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 16:53 · PVG 00:53 · LAX 08:53 · JFK 11:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.