python - 与 Python 的流畅界面

标签 python dsl fluent-interface

我有一个 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()

但是这个例子不如前一个例子那么好,我实际上更喜欢带有命名参数的原始版本。

感谢任何帮助。

最佳答案

可以这样完成,我不确定是否有更好的方法,因为这是我的第一次尝试。祝你好运!

DEFAULT_SENDER = 'my_address'
#Because the sender object is optional I assume you have a default sender

class Send_message(object):
    def __init__(self, message):
        self.message = message
        self.sender = None
        self.receiver = None
        self.method = None

    def to(self, receiver):
        self.receiver = receiver
        self.method = self.send()
        return self

    def _from(self, sender):
        self.sender = sender
        self.method = self.send()
        return self

    def __call__(self):
        if self.method:
            return self.method()
        return None

    def send(self):
        if self.receiver:
            if not self.sender:
                self.sender = DEFAULT_SENDER

            return lambda:actual_message_code(self.message, self.sender, self.receiver)


def actual_message_code(message, sender, receiver):
    print "Sent '{}' from: {} to {}.".format(message, sender, receiver)



Send_message("Hello")._from('TheLazyScripter').to('samba2')()
Send_message("Hello").to('samba2')._from('TheLazyScripter')()
Send_message("Hello").to('samba2')()

#Only change in actual calling is the trailing ()

通过实现__call__方法,我们可以知道何时处于调用链的末尾。这当然会添加尾随的 () 调用。并要求您更改指向实际消息传递方法和默认发送者变量的指针,但我认为这将是实现目标的最简单方法,而无需实际知道链何时结束。

关于python - 与 Python 的流畅界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37827808/

相关文章:

haskell - Haskell 中的类型化抽象语法和 DSL 设计

clojure - 如何在没有括号的情况下在 Clojure(Script) 中编写 DSL?

entity-framework - 指定外键 Entity Framework 代码优先,Fluent Api

delphi - Delphi 中具有继承性的流畅界面

Python(汤): get nested data and get last item in a tag

Python 3 和 Unicode - 如何打印换行符(理解这一点的一般问题)

java - 从 xtext 交叉链接 Java 类

c# - 是否有用于 c# 的流畅电子邮件库?

python - Azure 函数 - func 开始给出值不能为空的错误。参数名称: provider

python / Selenium : How can I emulate extensions such as uBlock or AdBlock using a headless Chrome driver?