<p>虽然jornsharpe提供了一个很好的解决方案,但我认为值得一提的是我的方法。在</p>
<p>如前所述,在动态语言中,您不关心类型,只关心对象具有的接口(所谓的“duck”)。那么,您的<code>MailRequest</code>对象是将逻辑上属于一起的参数分组的极好方法。然而,它并没有实现它应该实现的一切。我的方法是:</p>
<pre><code>class MailRequest(object):
def __init__(self, from_, to, subject, text, bcc=None, cc=None):
# I am asuming a good default for bbc is an empty list. If none
# is fine, just remove the None checks.
# Dont get confused about this, it just avoids a pitfall with
# mutable default arguments. There are other techniques however
if bcc is None:
bcc = []
if cc is None:
cc = []
self.from_ = from_
self.to = to
self.subject = subject
self.text = text
self.bcc = bcc
self.cc = cc
# No options needed
</code></pre>
<p>然后<code>send_email</code>函数如下所示:</p>
^{pr2}$
<p>注意,您只是记录了<code>mailReq</code>参数,指出传递的任何对象都应该提供<code>MailRequest</code>接口(至少部分)。这样,可以将参数的文档委托给<code>MailRequest</code>类。在</p>
<p>与<code>**kwargs</code>魔术相比,我更喜欢这种方法,因为参数在某个时刻显式地传递给一个刚性签名,该签名以某种方式充当文档。缺点是冗长。在</p>
<p><strong>编辑</strong></p>
<p>如果您担心<code>MailRequest</code>“构造函数”中的参数爆炸,解决方案是再做一个更深层次的操作:再次分组。例如,您可能希望将选项分组到自己的类中:</p>
<pre><code>class MailRequestOpts(object):
def __init__(self, bbc=None, cc=None, colour=None, lights='blue', blink=True):
# ...
self.bbc = bbc
self.cc = cc
self.colour = colour
# etc...
</code></pre>
<p>然后<code>MailRequestClass</code>将如下所示:</p>
<pre><code>class MailRequest(object):
def __init__(self, from_, to, subject, text, options=None):
"""
:type options: MailRequestOpts
"""
if options is None:
options = MailRequestOpts()
# ...
self.options = options
</code></pre>
<p>最后,如果一个进程需要50个参数,那么在某个时刻,您无法避免将它们全部传递给一个或多个分布式函数。你把他们分成几组取决于你和你在哪里找到平衡。在</p>