回顾一下 Python 3.4 中的枚举

开发 后端
Python 3.4 在 2014 年首次发布,尽管它已经发布了很长时间,但它引入的许多特性都没有被充分利用,而且相当酷。下面是其中的三个。

Python 3.4 在 2014 年首次发布,尽管它已经发布了很长时间,但它引入的许多特性都没有被充分利用,而且相当酷。下面是其中的三个。

[[402464]]

枚举

我最喜欢的逻辑谜题之一是自我描述的 史上最难的逻辑谜题。在其中,它谈到了三个“神”,他们被称为 A、B 和 C,他们的身份是真、假和随机,按一定顺序排列。你可以问他们问题,但他们只用神的语言回答,其中 “da” 和 “ja” 表示 “是” 和 “不是”,但你不知道哪个是哪个。

如果你决定使用 Python 来解决这个问题,你将如何表示神的名字和身份以及神的语言中的词语?传统的答案是使用字符串。然而,字符串的拼写错误可能会带来灾难性的后果。

如果在解题的关键部分,你用字符串 “jaa” 而不是 “ja” 进行比较,你就会得到一个错误的答案。虽然谜题没有说明风险是什么,但这可能是最好的避免方式。

enum 模块让你能够以一种可调试但安全的方式来定义这些东西:

  1. import enum 
  2. @enum.unique 
  3. class Name(enum.Enum): 
  4.     A = enum.auto() 
  5.     B = enum.auto() 
  6.     C = enum.auto() 
  7.     
  8. @enum.unique 
  9. class Identity(enum.Enum): 
  10.     RANDOM = enum.auto() 
  11.     TRUE = enum.auto() 
  12.     FALSE = enum.auto() 
  13.         
  14. @enum.unique 
  15. class Language(enum.Enum): 
  16.     ja = enum.auto() 
  17.     da = enum.auto() 

枚举的一个好处是,在调试日志或异常中,枚举的呈现方式是有帮助的:

  1. name = Name.A 
  2. identity = Identity.RANDOM 
  3. answer = Language.da 
  4. print("I suspect", name, "is", identity, "because they answered", answer) 
  1. I suspect Name.A is Identity.RANDOM because they answered Language.da 

functools.singledispatch

在开发游戏的“基础设施”层时,你想通用地处理各种游戏对象,但仍然允许这些对象自定义动作。为了使这个例子更容易解释,假设这是一个基于文本的游戏。当你使用一个对象时,大多数情况下,它只会打印 You are using <x>。但是使用一把特殊的剑可能需要随机滚动,否则会失败。

当你获得一个物品时,它通常会被添加到库存中。然而,一块特别重的石头会砸碎一个随机物品。如果发生这种情况,库存中会失去该物体。

处理这个问题的一个方法是在物品上设置 use 和 acquire 方法。随着游戏复杂性的增加,这些方法会越来越多,使游戏对象变得难以编写。

相反,functools.singledispatch 允许你以安全和尊重命名空间的方式追溯性地添加方法。

你可以定义没有行为的类:

  1. class Torch: 
  2.     name="torch" 
  3. class Sword: 
  4.     name="sword" 
  5. class Rock: 
  6.     name="rock" 
  1. import functools 
  2. @functools.singledispatch 
  3. def use(x): 
  4.     print("You use", x.name) 
  5. @functools.singledispatch 
  6. def acquire(x, inventory): 
  7.     inventory.add(x) 

对于火炬来说,这些通用的实现已经足够了:

  1. import functools 
  2. @functools.singledispatch 
  3. def use(x): 
  4.     print("You use", x.name) 
  5. @functools.singledispatch 
  6. def acquire(x, inventory): 
  7.     inventory.add(x) 
  1. You use torch 
  2. You have ['torch'] 

然而,剑和石头需要一些专门的功能:

  1. import random 
  2. @use.register(Sword) 
  3. def use_sword(sword): 
  4.     print("You try to use", sword.name) 
  5.     if random.random() < 0.9: 
  6.         print("You succeed") 
  7.     else: 
  8.         print("You fail") 
  9. deploy(sword) 
  1. You try to use sword 
  2. You succeed 
  3. You have ['sword', 'torch'] 
  1. import random 
  2. @acquire.register(Rock) 
  3. def acquire_rock(rock, inventory): 
  4.     to_remove = random.choice(list(inventory)) 
  5.     inventory.remove(to_remove) 
  6.     inventory.add(rock) 
  7. deploy(Rock()) 
  1. You use rock 
  2. You have ['sword', 'rock'] 

岩石可能压碎了火炬,但你的代码更容易阅读。

pathlib

从一开始,Python 中文件路径的接口就是“智能字符串操作”。现在,通过 pathlib,Python 有了一种面向对象的方法来操作路径。

  1. import pathlib 
  1. gitconfig = pathlib.Path.home() / ".gitconfig" 
  2. text = gitconfig.read_text().splitlines() 

诚然,用 / 作为操作符来生成路径名有点俗气,但在实践中却不错。像 .read_text() 这样的方法允许你从小文件中获取文本,而不需要手动打开和关闭文件句柄。

这使你可以集中精力处理重要的事情:

  1. for line in text: 
  2.     if not line.strip().startswith("name"): 
  3.         continue 
  4.     print(line.split("=")[1]) 
  1. Moshe Zadka 

欢迎来到 2014 年

Python 3.4 大约在七年前就发布了,但是在这个版本中首次出现的一些功能非常酷,而且没有得到充分利用。如果你还没使用,那么将他们添加到你的工具箱中。

 

责任编辑:赵宁宁 来源: Linux中国
相关推荐

2012-07-22 15:49:25

Java

2013-07-31 17:47:16

网站制作Web制作Web网站

2022-03-31 09:13:49

Cache缓存高并发

2018-09-03 14:05:08

编程语言Python编程技巧

2021-06-29 19:27:53

JAVA方法接口

2020-12-02 06:02:35

Python

2015-07-28 14:32:41

创业工作和家庭

2020-07-17 08:36:16

JVM性能监控

2023-07-05 08:45:18

Spring事务失效场景

2019-06-24 09:57:39

网络工具调试

2023-02-04 20:08:24

前端开发

2021-11-02 14:54:41

Go结构体标签

2020-02-10 14:26:10

GitHub代码仓库

2021-04-21 14:19:52

javaignalHandle接口

2022-04-11 08:08:52

OpenGauss数据库接口

2024-01-10 08:08:25

Python空值校验开发

2022-09-05 07:06:59

BeanSpring

2018-05-10 17:39:13

Python 机器学习编程语言

2022-05-18 07:43:09

Exchange交换器JUC

2020-03-01 17:53:38

Excel大数据微软
点赞
收藏

51CTO技术栈公众号