首页
学习
活动
专区
圈层
工具
发布

Python项目的5种枚举骚操作

最近在整理代码,顺便聊聊Python里的Enum。刚开始在别人的代码里看到枚举,我其实觉得有点多余。用字符串或者数字常量不也一样吗?为啥非要整个Enum出来,感觉是把简单问题复杂化了。...Enum成员,非常安全handle_ticket(TicketState.IN_PROGRESS)现在,如果有人想传入一个TicketState里没有定义的值,静态类型检查工具(比如mypy)直接就会报警...通过多继承一个str,这个Enum的成员就拥有了字符串的所有特性。...这样做的好处是,它能和Pydantic、SQLAlchemy这类库无缝集成,序列化成JSON或者存入数据库时,它表现得就像一个普通的字符串,但在代码层面,它又保留了Enum的类型安全和代码补全等优点。...给Enum添加方法这个玩法是我后来才发现的,在Enum内部直接定义方法。一开始我觉得挺奇怪的,Enum不是用来放常量的吗?但如果某些逻辑和这个Enum强绑定,那把方法写在里面就非常合适。

23810

Python中IntEnum 与 StrEnum新枚举类型

五、使用 Python 多态时的常见问题和错误类型判断错误:在多态场景中,很容易用错类型判断的方法,比如用 type () 而不是 isinstance ()。...在 IntEnum 和 StrEnum 中,它们都是枚举类型,都可以被当作枚举来使用,但当进行运算或调用方法时,IntEnum 能进行数学运算,StrEnum 能使用字符串方法,这就是多态的体现。...而且 IntEnum 的类型更明确,能减少错误。问题:使用 StrEnum 时,auto () 功能有什么用?...回答:auto () 功能在 StrEnum 中可以让成员的值自动设为成员名的小写形式,这样就不用我们手动去声明字符串值了,既节省了代码,又提高了可读性,还能避免手动输入时可能出现的错误。...回答:首先要确保类之间有正确的继承关系,这是多态的基础;其次在进行类型判断时,尽量使用 isinstance () 而不是 type (),因为 isinstance () 会考虑继承;另外,重写方法时要注意参数和返回值的类型

53910
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    SqlAlchemy 2.0 中文文档(三十一)

    还包括当访问 User.id 和 User.name 类级属性时,如上面的 select() 语句中所示,它们与 SQL 表达式行为兼容,这是从 InstrumentedAttribute 属性描述符类派生的...(50), nullable=False) other_name: Mapped[Optional[str]] = Column(String(50)) 当类型是非可选时,这意味着从MyClass...它还包括当访问 User.id 和 User.name 类级属性时,正如它们在上面的 select() 语句中那样,它们与 SQL 表达式行为兼容,这是从 InstrumentedAttribute 属性描述符类派生的...(50), nullable=False) other_name: Mapped[Optional[str]] = Column(String(50)) 当类型是非可选时,这意味着从 MyClass...(50), nullable=False) other_name: Mapped[Optional[str]] = Column(String(50)) 当类型为非可选时,这意味着从MyClass

    1.7K20

    Python 类型提示 TypedDict 告别字典类型错误,提升代码编辑器体验!

    方式 1:类继承 TypedDict(推荐)通过定义一个类继承TypedDict,类里的属性就是字典的字段和类型。这是最直观、最常用的方式。...["时,编辑器会自动补全x和y;少传字段或类型错时,会出现红色波浪线,鼠标放上去能看到错误原因。...五、避坑指南:处理关键字冲突、版本兼容等问题用 TypedDict 时,会遇到一些细节问题,比如字段名是 Python 关键字(for、class、if),或者版本不兼容导致的错误。咱们逐个解决。...TypedDict 和 NamedTuple 有什么区别?该怎么选?回答思路:从 “可变性”“用途”“访问方式” 三个维度对比,最后给选择建议。...)在运行前检查错误 —— 终端运行mypy 脚本.py,mypy 会根据 TypedDict 的定义,找出字段缺失、类型错误的问题,提前规避运行时 bug。”

    84410

    Python类型注解:让代码“开口说话”的隐形助手

    而Python类型注解(Type Hints)的出现,正是为了解决这类痛点——它像给代码添加的“智能标签”,让变量、函数和类的类型信息一目了然。...编译时检查”能将类型错误从运行时提前到开发阶段。...IDE智能支持:现代IDE(如PyCharm、VS Code)利用类型注解提供精准的代码补全、错误高亮和重构建议。例如,当函数参数标注为List[str]时,IDE会自动提示列表的字符串操作方法。...IDE集成:实时类型提示与错误检测PyCharm:自动识别类型注解,提供方法签名提示和类型不匹配警告。VS Code:安装Python扩展后,结合mypy或pyright实现实时检查。3....忽略类型注解的维护当函数逻辑变更时,需同步更新类型注解。

    81910

    【Python报错已解决】TypeError: descriptor ‘lt‘ for ‘int‘ objects doesn‘t apply to a‘str‘ object

    sort方法在执行过程中会对列表中的元素进行两两比较,当遇到整数和字符串的比较时,就会触发TypeError,因为sort方法使用了元素类型相关的比较逻辑(类似于和字符串之间没有合适的默认比较方式...(如字符串),mypy在静态分析时就会提示类型错误,帮助我们在编写代码阶段发现问题,而不是在运行时遇到报错。..."world", 7] print(sort_data(my_list)) 这里使用typing模块来指定函数参数和返回值的类型,mypy可以检查代码是否符合类型规范,帮助我们避免类型不兼容导致的比较问题...三、其他解决方法 使用Python的异常处理机制来更优雅地处理可能出现的类型错误。...深入剖析了报错原因,即Python比较操作符对于不同类型对象有特定规则,当整数和字符串等不兼容类型进行比较时,由于没有统一的比较逻辑而导致报错。

    51210

    【笔记】《深入理解C++11》(上)

    , POD 库编程: 内联命名空间, 继承构造, 右值引用 C++11标准的设计准则: 在稳定性和兼容性之间抉择: auto, using, nullptr 用库而非扩展语言语法来实现特性: std::..., 所以当发生冲突的时候应该显式声明构造函数来因此冲突的函数 当派生类是虚继承了基类时, 不能使用继承构造函数 一旦使用了继承构造函数(用using Base::Base;)暴露出来, 自身的默认构造函数就和之前的隐藏规则一样...POD需要满足以下条件: 平凡(Plain)限制: 与memset兼容的默认的构造和析构函数 与memcpy兼容的拷贝, 移动, 赋值, 移动赋值函数 不包含虚函数和虚基类 标准布局(Old)限制: 所有非静态成员有相同的访问权限...4 新手易学, 老兵易用 auto auto是静态类型推导, 必须被初始化 auto本质上是一个类型占位符, 在编译的时候推导出类型然后以类似字面替换的方式进行使用 auto和cv限制符(cv-qualifier...而且由于其本质是常量数值的原因, enum成员总是可以被隐式转换为整型, 这很容易导致比较两个不同的枚举名称时出现错误的结果 C++11之前会通过类结构将枚举封装, 并建立新的转换和比较函数覆盖原先的操作

    2.7K20

    为什么Python一定要坚持标注所有类型?代码健壮性提升秘籍

    函数返回值不匹配:比如函数注解写的返回int,结果实际返回了str,mypy 也能查出来。...in 1 file (checked 1 source file)清晰地指出了代码中的类型错误。...首先,它能保持代码的一致性,整个项目里的变量和函数类型都有明确标注,不会出现同一个变量一会儿是这类型,一会儿是那类型的情况。...答:类型注解可以提前规避很多类型错误,提升代码的自文档化能力,方便团队协作,还能让静态类型检查工具进行校验,使代码更健壮、易维护。如何使用 mypy 工具?...为什么在大型项目中推荐使用类型注解?答:在大型项目中,代码量多,参与的开发者也多,类型注解可以保持代码的一致性,减少因类型问题导致的错误,降低开发者之间的沟通成本,让代码更容易理解和维护。

    35210

    终极 C++避坑指南

    %s来匹配 枚举 枚举类型原本是用于解决固定范围取值的类型表示,但由于在 C 语言中被定义为了整型类型的一种语法糖,导致枚举类型的使用上出现了一些问题。...这样的话不仅浪费空间,还会出现二义性问题,例如d.a1到底是指从B继承来的a1还是从C里继承来的呢? C++引入虚拟继承的概念就是为了解决这一问题。...出于对 C 语言兼容、以及上一节所介绍的 C++希望将“语言”和“类型”解耦的设计理念的目的,在 C++中,字符串并没有映射为std::string类型,而是保留 C 语言当中的处理方式。...但是,更多的场景下,我们都会使用std::string类型来保存和处理字符串,因为它功能更强大,使用更方便。得益于隐式构造,我们可以把一个字符串常量轻松转化为std::string类型来处理。...因此,如果我们给char、signed char、unsigned char类型取地址时,一定要考虑会不会被识别为字符串。

    2.9K20

    让你的 Python 静态起来

    Django model Protocol 自定义类型 普通用法类 型自定义时 辅助函数 typing-extensions 实例:简化的枚举类型 工程技巧 避免循环引用 mypy 再让我们看看那个例子...所以,如果 Python 能够 “静态” 一些,将会给我们带来几个明显的增益: 大幅度提升代码的可读性 能够将参数传递时的 类型错误 扼杀在摇(biān)篮(mǎ)中 能够最大程度利用 IDE 提供的代码提示...我们可以对任何变量进行类型注解,无论是赋值之前还是函数传参和返回 # 我们可以从类、模块、函数的 `__annotations__` 变量中获取这些注解 nine_realms: List[str] =...原则上这里就只能输入字符串 "red" "blue" "yellow",某些简单的场景下,我们不用额外定义枚举类型。...mypy mypy 原来是一个兼容大部分 Python 语法的静态类型的 Python 发行版,后来在官方受到启发,并加入类型注解之后,mypy 已经演化成了一个静态类型检查器,我们可以通过 pip 来安装

    1.4K60

    如何提升Python代码的可读性和防错能力!

    在讲怎么用之前,先明确它的价值,不然你可能觉得 “多写一行代码没必要”:读代码更快:别人看你代码时,不用猜变量 / 参数类型,比如name: str一看就知道是字符串;减少运行时错误:比如函数要求传int...想让它帮你查错,得用工具(比如mypy),后面会讲。三、函数类型提示:参数和返回值怎么写?函数是协作中最容易出问题的地方 —— 别人不知道传啥参数、不知道返回啥值。给函数加类型提示,这问题直接解决。...比如:先安装 mypy:pip install mypy写一个有类型错误的代码(比如给int类型的变量赋值str):# 代码文件:test.pyage: int = "25" # 类型提示是int,但赋值了...回答:主要是 3 个好处:提升可读性:别人看代码不用猜变量 / 参数类型,比如user: User一看就知道是 User 类实例;减少错误:用 mypy 工具能提前查到类型错(比如传 str 给 int...面试官:怎么给函数的 * args 和 **kwargs 加类型提示?

    26610

    流畅的 Python 第二版(GPT 重译)(四)

    逐渐类型系统: 是可选的 默认情况下,类型检查器不应对没有类型提示的代码发出警告。相反,当无法确定对象类型时,类型检查器会假定Any类型。Any类型被认为与所有其他类型兼容。...② Mypy 报告了问题:“alert_duck"的第 1 个参数类型不兼容:“Bird”;预期是"Duck”。...③ 我在if条件中使用了海象操作符:=。它将unicodedata.name()调用的结果赋给name,整个表达式的值就是该结果。当结果为''时,为假值,index不会被更新。...⑥ Mypy 标记这行是因为display_wrong与update的display参数中的类型提示不兼容。...另一方面,当需要处理float时,提供一个接受int参数的回调是类型错误的。

    1.1K10

    CCPP中的auto关键字对比分析

    编程时通常需要把表达式值式赋给变量,这就要求在声明变量时清楚的知道表达式的类型,C++11新标准引入了auto 类型说明符,让编译器去分析表达式的类型。...= 0, pi = 3, 14; //错误:sz和pi的类型不一致 auto和decltype 的作用有点相似,都可以推断某个表达式的具体类型,当我们希望从表达式的值推断出要定义的变量的类型...//从输入中读取一行赋值给str1 //auto 是一个类型说明符,通过变量的初始值来判断变量的类型 for (auto &c : str) //对于字符串...先 从键盘读取一行字符串,然后使用范围for语句对其进行处理,在范围for语句中使用auto关键字推断变量c的数据类型,因为要改变字符串中的字符,所以将循环变量C定义为引用类型,然后使用for循环依次处理字符串...str中的字符,将其修改为字符‘X’,在使用下标处理字符串中的字符是,我们需要知道字符串的长度,c++中的size()函数用于返回字符串的长度,即:字符串中字符的个数,类似于C语言中的strlen,字符串的下标从

    1.3K20

    C++11新特性学习笔记

    终端:g++ xxx.cpp -std=c++11 类型推导 auto auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型。...因此,在C语言中,可以在定义局部变量时省略auto关键字,直接使用int或其他数据类型。 C++中的auto是类型推导关键字,用于自动推导变量的类型,可以简化代码并且提高代码可读性。...,或者派生类是从基类中虚继承,那么不能继承构造函数 l 一旦使用继承构造函数,编译器不会再为派生类生成默认构造函数 4.2 委托构造 和继承构造函数类似,委托构造函数也是C++11中对C++的构造函数的一项改进...类的其它几类特殊成员函数也和默认构造函数一样,当存在用户自定义的特殊成员函数时,编译器将不会隐式的自动生成默认特殊成员函数,而需要程序员手动编写,加大了程序员的工作量。...unique_ptr指针本身的生命周期:从unique_ptr指针创建时开始,直到离开作用域。 离开作用域时,若其指向对象,则将其所指对象销毁(默认使用delete操作符,用户可指定其他操作)。

    2.6K20

    C++11新特性学习笔记

    终端:g++ xxx.cpp -std=c++11 类型推导 auto auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型。...因此,在C语言中,可以在定义局部变量时省略auto关键字,直接使用int或其他数据类型。 C++中的auto是类型推导关键字,用于自动推导变量的类型,可以简化代码并且提高代码可读性。...,或者派生类是从基类中虚继承,那么不能继承构造函数 l 一旦使用继承构造函数,编译器不会再为派生类生成默认构造函数 4.2 委托构造 和继承构造函数类似,委托构造函数也是C++11中对C++的构造函数的一项改进...类的其它几类特殊成员函数也和默认构造函数一样,当存在用户自定义的特殊成员函数时,编译器将不会隐式的自动生成默认特殊成员函数,而需要程序员手动编写,加大了程序员的工作量。...unique_ptr指针本身的生命周期:从unique_ptr指针创建时开始,直到离开作用域。 离开作用域时,若其指向对象,则将其所指对象销毁(默认使用delete操作符,用户可指定其他操作)。

    2.8K20

    c++17好用的新特性总结

    前言 从C++11开始,标志着c++的复兴和现代C++的开端。尽管有各种新语言层出不穷,但涉及性能和系统层面c++仍然是首选,地位无可撼动。...inline变量出现后,我们可以直接将全局变量定义在头文件中,而不用担心出现redefine的错误信息。...std::string_view对字符串不具有所有权,且兼容std::string和const char*两种类型。...c++17之前,我们处理只读字符串往往使用const std::string&,std::string有两点性能优势: 兼容两种字符串类型,减少类型转换和内存分配。...总结一下,c++17新增的三种类型给c++带来了更现代更安全的类型系统,它们对应的使用场景是: std::any适用于之前使用void*作为通用类型的场景。

    4.2K10

    流畅的 Python 第二版(GPT 重译)(七)

    ⑥ loaded委托给bool。¹⁴ ⑦ 总是可以以这种方式调用register,当你需要注册一个你不维护但符合接口的类时,这样做是很有用的。...提示 如果您正在使用外部类型检查器,那么显式的isinstance检查有一个优点:当您编写一个条件为isinstance(o, MyType)的if语句时,那么 Mypy 可以推断在if块内,o对象的类型与...这个导入会导致类型提示被存储为字符串,而不会在导入时被评估,当函数定义被评估时。...我将继续关注 Mypy 问题#3186,期待这个传奇的下一章有一个让静态类型和鹅类型兼容的美好结局——因为它们应该是兼容的。 ¹ 设计模式:可复用面向对象软件的元素,“介绍”,p. 18。...¹⁴ 避免从具体类继承 从具体类进行子类化比从 ABC 和 mixin 进行子类化更危险,因为具体类的实例通常具有内部状态,当您覆盖依赖于该状态的方法时,很容易破坏该状态。

    88410

    Python编程小妙招:解锁高效开发的秘密武器

    智能断言 pytest框架的断言能自动展示差异详情,当断言失败时直接输出期望值与实际值的对比。支持复杂条件组合(如范围检查、包含关系),让测试用例既是质量保障又是活文档。...这些工具将Python从脚本语言进化为探索性编程的终极环境。...枚举的高级用法 Enum枚举类为常量赋予意义和类型安全。auto()自动生成值,类方法实现枚举相关的业务逻辑。...相比裸字符串或数字,枚举使代码更自文档化,配合mypy类型检查还能在编码阶段发现潜在错误。...当遇到性能问题想到生成器和slots,遇到配置管理想到字典合并,遇到代码异味想到装饰器重构——这才是内化的Python哲学。优雅的代码是思考方式的具象化。

    32901

    使用 Mypy 检查 30 万行 Python 代码,总结出 3 大痛点与 6 个技巧!

    当首次发起提议时,我们有两个主要的考虑:虽然 Mypy 在 2012 年的 PyCon 芬兰大会上首次亮相,并在 2015 年初发布了兼容 PEP-484 的版本,但它仍然是一个相当新的工具——至少对我们来说是这样...外部库缺乏类型注解最重要的痛点是,我们引入的大多数第三方 Python 库要么是无类型的,要么不兼容 PEP-561。在实践中,这意味着对这些外部库的引用会被解析为不兼容,这会大大削弱类型的覆盖率。...(装饰器的另一个问题是我前面提过的@functools.lru_cache :由于装饰器最终定义了一个全新的函数,所以如果你不正确地注解代码,就可能会出现严重而令人惊讶的错误。)...我对循环导入也有类似的感觉——由于要导入类型作为注解使用,这就可能导致出现本可避免的循环导入(这也是 Zulip 团队强调的一个痛点)。...GitHub 上的问题当搜索如何解决某个类型问题时,我经常会找到 Mypy 的 GitHub Issues (比 Stack Overflow 还多)。

    1.4K20
    领券