#yyds干货盘点#python pass和match

​pass​​ 语句不执行任何操作。语法上需要一个语句,但程序不实际执行任何动作时,可以使用该语句。例如:

下面的代码创建一个最小类:

[En]

The following code creates a minimum class:

​pass​​​ 还可以用作函数或条件子句的占位符,让开发者聚焦更抽象的层次。此时,程序直接忽略 ​ ​pass​​:>>>

​match​​ 语句

A ​ ​match​​ statement takes an expression and compares its value to successive patterns given as one or more case blocks. This is superficially similar to a switch statement in C, Java or JavaScript (and many other languages), but it can also extract components (sequence elements or object attributes) from the value into variables.

最简单的形式是将目标值与一个或多个文字值进行比较:

[En]

The simplest form is to compare a target value with one or more literal values:

注意最后一个代码块:”变量名” ​ ​_​​ 被作为 通配符 并必定会匹配成功。 如果没有 case 语句匹配成功,则不会执行任何分支。使用 ​ ​|​​ (” or “)在一个模式中可以组合多个字面值:

该模式类似于解包赋值,可用于绑定变量:

[En]

The pattern is similar to unpacking assignment and can be used to bind variables:

请仔细研究此代码! 第一个模式有两个字面值,可以看作是上面所示字面值模式的扩展。但接下来的两个模式结合了一个字面值和一个变量,而变量 绑定 了一个来自目标的值(​ ​point​​​)。第四个模式捕获了两个值,这使得它在概念上类似于解包赋值 ​ ​(x, y) = point​​。

如果使用类来实现数据结构,则可以在类名之后添加一个类似于构造函数的参数列表,这会将属性放入变量中:

[En]

If you use a class to implement the data structure, you can add a list of parameters similar to the constructor after the class name, which puts the attribute in the variable:

可在 dataclass 等支持属性排序的内置类中使用位置参数。还可在类中设置 ​ ​__match_args__​​​ 特殊属性为模式的属性定义指定位置。如果它被设为 (“x”, “y”),则以下模式均为等价的,并且都把 ​ ​y​​​ 属性绑定到 ​ ​var​​ 变量:

读取模式的推荐方式是将它们看做是你会在赋值操作左侧放置的内容的扩展形式,以便理解各个变量将会被设置的值。 只有单独的名称(例如上面的 ​ ​var​​​)会被 match 语句所赋值。 带点号的名称 (例如 ​ ​foo.bar​​​)、属性名称(例如上面的 ​ ​x=​​​ 和 ​ ​y=​​​)或类名称(通过其后的 “(…)” 来识别,例如上面的 ​ ​Point​​)都绝不会被赋值。

模式可以随意嵌套。例如,如果您有一个很短的点列表,则可以通过以下方式匹配它们:

[En]

Patterns can be nested at will. For example, if you have a short list of points, you can match them in the following way:

为模式添加成为守护项的 ​ ​if​​​ 子句。如果守护项的值为假,则 ​ ​match​​ 继续匹配下一个 case 语句块。注意,值的捕获发生在守护项被求值之前:

match 语句的其他特性:

  • 与解包赋值类似,元组和列表模式具有完全相同的含义,实际上可以匹配任何序列。但是它们不能匹配迭代器或字符串。
    [En]

    similar to unpacking assignment, tuples and list patterns have exactly the same meaning and can actually match any sequence. But they cannot match iterators or strings.*

  • 序列模式支持扩展解包操作:​ ​[x, y, *rest]​​​和​ ​(x, y, *rest)​​​的作用类似于解包赋值。 在​ ​*​​​之后的名称也可以为​ ​_​​​,因此,​ ​(x, y, *_)​​可以匹配包含至少两个条目的序列,而不必绑定其余的条目。
  • Mapping patterns:​ ​{"bandwidth": b, "latency": l}​​​captures the​ ​"bandwidth"​​​and​ ​"latency"​​​values from a dictionary. Unlike sequence patterns, extra keys are ignored. An unpacking like​ ​**rest​​​is also supported. (But​ ​**_​​would be redundant, so it is not allowed.)
  • 使用​ ​as​​关键字可以捕获子模式:

  • 将把输入的第二个元素捕获为​ ​p2​​(只要输入是包含两个点的序列)

  • 大多数字面值是按相等性比较的,但是单例对象​ ​True​​​,​ ​False​​​和​ ​None​​则是按标识号比较的。
  • 模式可以使用命名常量。 这些命名常量必须为带点号的名称以防止它们被解读为捕获变量:

Original: https://blog.51cto.com/u_15477882/5565467
Author: D八哥卷
Title: #yyds干货盘点#python pass和match

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/500885/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球