-2

我正在将用 Python 编写的 Sonos 控制器移植到另一种语言。我很难理解这个方法调用在做什么:

 def __send_command(self, endpoint, action, body):
        headers = {
            'Content-Type': 'text/xml',
            'SOAPACTION': action
        }

        soap = SOAP_TEMPLATE.format(body=body)

特别是 .format 方法。据我所知,soap、SOAP_TEMPLATE 和 body 都是字符串。

在哪里:

SOAP_TEMPLATE = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body>{body}</s:Body></s:Envelope>'

body = '<u:GetPositionInfo xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID><Channel>Master</Channel></u:GetPositionInfo>'

有人可以用简单的英语解释该.format方法的作用吗?

4

3 回答 3

3

Python 有字符串格式。这是一种格式化字符串的方法。(准备它们,把它们放在一起)

例子:

>>> "hello {name}".format(name="garry")
'hello garry'

或者,一个更好的例子:

>>> for name in ["garry", "inbar"]:
    print "hello {name}".format(name=name)


hello garry
hello inbar

在你的情况下,可能SOAP_TEMPLATE是一个包含{body}标签的字符串,这个函数接受它并将body传递给函数的内容添加到该字符串中。

于 2013-07-11T14:37:03.737 回答
3

str.format()将值插入字符串并让您设置这些值的格式。

您的字符串包含简单的占位符{body},并被作为关键字传入的值替换.format(body=body)

您的模板的简短版本是:

>>> 'Hello {body}!'.format(body='World!')
'Hello World!!'

有关模板槽如何让您指定要插入的值的详细信息,请参阅格式字符串语法,以及有关如何更改值格式的格式规范迷你语言。{}

于 2013-07-11T14:37:24.720 回答
3

其他答案是正确的:这是关于字符串格式的。

您的示例大致相当于:

def __send_command(self, endpoint, action, body):
    # ... some code here ...
    soap = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body>' + body + '</s:Body></s:Envelope>'
    # ... some code here ...

免责声明:代码不是pythonic,如果body不是str类型,它也可能会中断。我构建它的唯一原因是展示一些可能更像不同语言的东西(假设语言具有用于连接字符串的相似符号)。

于 2013-07-11T14:43:14.277 回答