当前位置: 首页 > 科技观察

回想一下Python3.4中的枚举

时间:2023-03-13 23:59:22 科技观察

Python3.4于2014年首次发布,尽管它已经存在了很长时间,但它引入的许多功能都没有得到充分利用,而且非常酷。以下是其中的三个。列举我最喜欢的逻辑谜题之一是有史以来最难的逻辑谜题。里面说了三个“神”,分别叫做A、B、C,他们的身份分别是真、假、随机,顺序是一定的。你可以问他们问题,但他们只会用上帝的语言回答,其中“da”和“ja”的意思是“是”和“否”,但你不知道哪个是哪个。如果你决定用Python来解决这个问题,你会如何表示神的名字和身份以及神的语言中的单词?传统的答案是使用字符串。然而,拼写错误的字符串可能会带来灾难性的后果。如果您在解决方案的关键部分比较字符串“jaa”而不是“ja”,您将得到错误的答案。虽然谜题没有说明风险是什么,但这可能是避免风险的最佳方法。枚举模块允许您以可调试但安全的方式定义这些东西: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.RANDOAnswer=Language.daprint("Isuspect",name,"is",identity,"becausetheyanswered",answer)IsuspectName.AisIdentity.RANDOMbecausetheyanansweredLanguage.dafunctools.singledispatch在开发游戏的“基础设施”层时,您希望通用地处理各种游戏对象,但仍允许这些对象自定义操作。为了使这个例子更容易解释,假设这是一个基于文本的游戏。当你使用一个对象时,大多数时候,它只是打印你正在使用。但是使用特殊的剑可能需要随机掷骰,否则会失败。当您获得一件物品时,它通常会添加到您的库存中。但是,一块特别重的石头会砸碎一个随机物品。如果发生这种情况,该对象将从库存中丢失。处理此问题的一种方法是在项目上使用和获取方法。随着游戏复杂度的增加,这些方法会成倍增加,使得游戏对象难以编写。相比之下,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)对于torch这些通用实现就足够了: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=随机。choice(list(inventory))inventory.remove(to_remove)inventory.add(rock)deploy(Rock())YouuserockYouhave['sword','rock']石头可能压碎了火炬,但是你的代码很简单呃阅读。pathlib的Python文件路径接口从一开始就是“智能字符串操作”。现在,有了pathlib,Python有了一种面向对象的方式来操作路径。importpathlibgitconfig=pathlib.Path.home()/".gitconfig"text=gitconfig.read_text().splitlines()诚然,使用/作为运算符来生成路径名有点俗气,但在实践中效果很好。.read_text()等方法允许您从小文件中获取文本,而无需手动打开和关闭文件句柄。这使您可以专注于重要的事情:forlineintext:ifnotline.strip().startswith("name"):continueprint(line.split("=")[1])MosheZadka欢迎使用Python3.4,大约在2014年它已发布七年前,但此版本中首次亮相的一些功能非常酷且未得到充分利用。如果您还没有将它们添加到您的工具箱中。