gpt4 book ai didi

python - 在 Python 中设计长链

转载 作者:太空狗 更新时间:2023-10-29 17:22:48 25 4
gpt4 key购买 nike

我编写了一个“基于链”的 Python API(类似于 jQuery)。所以我可以写:

myObject.doStuff().doMoreStuf().goRed().goBlue().die()

问题是我还没有找到一种方法来保持长链的语法整洁。在 JavaScript 中我可以简单地做

myOjbect
.doStuf()
.doMoreStuf()
.goRed()
.goBlue()
.die()

但是Python有缩进限制...

最佳答案

符合 PEP8 的解决方案:格式化行

实际上 PEP8说:

Long lines can be broken over multiple lines by wrapping expressions in parentheses. These should be used in preference to using a backslash for line continuation. Make sure to indent the continued line appropriately.

所以我想你的代码应该是这样的:

(
myOjbect
.doStuf()
.doMoreStuf()
.goRed()
.goBlue()
.die()
)

替代解决方案:拆分成单独的语句

从语法来看,对于每个方法调用返回的值,有两种可能的选择:

  1. 每个方法(可能除了 die() 之外,它不是必需的,因为它的结果未被使用)返回修改后的实例(调用它的同一实例)。
  2. 每个方法(仍然不需要 die() 执行此操作)返回调用它的实例的副本

可变对象的解决方案(方法返回原始实例)

第一种情况(当返回同一个实例时),将较长的行拆分为多个语句的解决方案是:

myObject.doStuf()
myObject.doMoreStuf()
myObject.goRed()
myObject.goBlue()
myObject.die()

现实世界的例子涉及可变对象:

my_stuff = []
my_stuff.append('laptop') # my_stuff == ['laptop']
my_stuff.append('jacket') # my_stuff == ['laptop', 'jacket']
my_stuff.append('apple') # my_stuff == ['laptop', 'jacket', 'apple']

(尽管 list.append() 不返回任何内容,只是为了保持一致性并明确声明它是可变的)

不可变对象(immutable对象)的解决方案(方法返回修改后的副本)

第二种情况(返回副本时),做类似事情的解决方案是:

myObject = myObject.doStuf()
myObject = myObject.doMoreStuf()
myObject = myObject.goRed()
myObject = myObject.goBlue()
myObject.die()

现实世界的例子涉及不可变对象(immutable对象):

name = '-Tadek-'
name = name.strip('-') # name == 'Tadek'
name = name.lower() # name == 'tadek'
name = name.replace('k', 'ck') # name == 'tadeck'

关于python - 在 Python 中设计长链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8818484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com