Python 3.4中枚举的示例分析

这篇文章给大家分享的是有关Python 3.4中枚举的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

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

Python 3.4中枚举的示例分析

枚举

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

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

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

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

importenum@enum.uniqueclassName(enum.Enum):A=enum.auto()B=enum.auto()C=enum.auto()@enum.uniqueclassIdentity(enum.Enum):RANDOM=enum.auto()TRUE=enum.auto()FALSE=enum.auto()@enum.uniqueclassLanguage(enum.Enum):ja=enum.auto()da=enum.auto()

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

name=Name.Aidentity=Identity.RANDOManswer=Language.daprint("Isuspect",name,"is",identity,"becausetheyanswered",answer)
IsuspectName.AisIdentity.RANDOMbecausetheyansweredLanguage.da

functools.singledispatch

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

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

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

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

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

classTorch:name="torch"classSword:name="sword"classRock:name="rock"
importfunctools@functools.singledispatchdefuse(x):print("Youuse",x.name)@functools.singledispatchdefacquire(x,inventory):inventory.add(x)

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

importfunctools@functools.singledispatchdefuse(x):print("Youuse",x.name)@functools.singledispatchdefacquire(x,inventory):inventory.add(x)
YouusetorchYouhave['torch']

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

importrandom@use.register(Sword)defuse_sword(sword):print("Youtrytouse",sword.name)ifrandom.random()<0.9:print("Yousucceed")else:print("Youfail")deploy(sword)
YoutrytouseswordYousucceedYouhave['sword','torch']
importrandom@acquire.register(Rock)defacquire_rock(rock,inventory):to_remove=random.choice(list(inventory))inventory.remove(to_remove)inventory.add(rock)deploy(Rock())
YouuserockYouhave['sword','rock']

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

pathlib

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

importpathlib
gitconfig=pathlib.Path.home()/".gitconfig"text=gitconfig.read_text().splitlines()

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

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

forlineintext:ifnotline.strip().startswith("name"):continueprint(line.split("=")[1])
MosheZadka

感谢各位的阅读!关于“Python 3.4中枚举的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

发布于 2021-06-13 23:21:13
收藏
分享
海报
0 条评论
175
上一篇:Visual Studio如何安装离线插件vsix 下一篇:如何使用JavaScript实现表格数据管理
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码