【发布时间】:2016-06-15 06:38:20
【问题描述】:
我有一个 Python 函数“send_message”,它接受三个参数:
send_message("i like windmills", to="INBOX", from="OUTBOX")
我正在考虑在其上放置一个流畅的界面。理想情况下,我想写以下任何内容:
send_message("i like windmills").to("INBOX").from("OUTBOX")
send_message("i like windmills").from("OUTBOX").to("INBOX")
# The `to()` information is mandatory but the `from()` is not (as with real letters), so this one would also be a valid call:
send_message("i like windmills").to("INBOX")
任何想法如何完成这个或类似的事情?
我理解让对象的方法返回“self”的一般方法,但在我的理解中,这会导致这样的事情:
message = Message("i like windmills")
message.to("INBOX").from("OUTBOX").send()
但是这个不如前面的例子好,然后我实际上更喜欢带有命名参数的原始版本。
感谢任何帮助。
【问题讨论】:
-
你想实现Builder Pattern。
send_message将是创建构建器的工厂方法。 -
或者你可以实现currying;它避免了 OP 显然不需要的对象“开销”。
-
嗨,Lutz,不完全是。构建器模式需要链中的最后一个“build()”方法来实际执行操作。我希望找到一种方法,让链中的每个方法都可以判断它是否是最后一个(通过元编程?)。如果是这种情况,它实际上会隐式执行操作。
-
@samba2:那么请编辑您的问题,这与 Builder 模式有何不同。我不明白
message.to("INBOX").from("OUTBOX").send()是如何“不如前一个示例好” 的,我认为您的意思是不应该有一个尾随/build()/send()/whatever()调用,并且每个方法调用都应该自动计算如果它是链中的最后一个,如果是,则触发.send()。这对我来说听起来不受欢迎且有风险,因为现在你不能像general_msg = send_message("i like windmills").from("OUTBOX")和specific_msg = general_msg.to("Shirley")那样做多个任务。.. -
...没有第一次分配触发广泛的
.send()给所有人。并且它强制你所有流畅的行成为一行,行长不受限制,不能跨行拆分复杂的代码。
标签: python dsl fluent-interface