在Python中设计长链

2024-10-02 02:44:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

^{pr2}$

但是Python有缩进限制。。。在


Tags: 方法pythonapi语法javascriptjquerydiemyobjectpr2
3条回答

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()不需要这样做)返回调用它的实例的copy。在

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

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

^{pr2}$

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

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()不返回任何内容,只是为了保持一致性并明确声明它是可变的)

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

第二种情况下(返回copy时),执行类似操作的解决方案是:

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

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

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

虽然我不会称之为“干净”,但可以在括号内打断:

myOjbect.doStuf(
   ).doMoreStuf(arg1, arg2
   ).goRed(
   ).goBlue(
   ).die()

但口味各不相同,所以我把它作为完整性的答案。在

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

(我为myObject感到抱歉。听起来很痛苦。)

相关问题 更多 >

    热门问题