<p>这不需要宏;函数是一级对象,可以动态构建:</p>
<pre><code>def make_callback(m_type, other_type, *attrs):
def callback(msg):
m = m_type(msg)
a = other_type()
for attr in attrs:
setattr(a, attr, getattr(m, attr))
pub2.publish(a)
return callback
callback1 = make_callback(MsgX, msg_type_a, 'x')
callback2 = make_callback(MsgY, msg_type_b, 't', 'u')
</code></pre>
<p>如果您愿意以某种方式标准化类型,您可以使其更简单。例如,如果这些<code>other_type</code>事物中的每一个都是<code>namedtuple</code>-ish类型(具有<code>_fields_</code>或{<cd4>}或其他一些属性名的iterable):</p>
^{pr2}$
<p>或者,如果<code>msg_type</code>只知道如何从<code>MsgTypes</code>构造自己:</p>
<pre><code>def make_callback(m_type, other_type):
def callback(msg):
m = m_type(msg)
a = other_type(m)
pub2.publish(a)
return callback
callback1 = make_callback(MsgX, msg_type_a)
callback2 = make_callback(MsgY, msg_type_b)
</code></pre>
<p>或者,如果<code>MsgTypes</code>知道如何将自己转换为<code>msg_types</code>(甚至可能是动态生成的):</p>
^{4}$
<p>等等。所有基本的OO设计在适当的时候都可以在Python中使用(很难从你的玩具示例中知道什么是合适的),但是当它们不合适的时候,你有很多反射/动态特性可以使用。在</p>
<hr/>
<p>这会影响性能吗?在</p>
<p>好吧,您要么在一个包含两个事物的列表上循环,要么添加一个额外的函数调用,这需要几纳秒的时间。但这真的很重要吗?如果是这样的话,您几乎肯定希望更改您的设计,以便可以更便宜地构造<code>msg_type</code>类型(例如,在一个调用中),等等,并且在这样做的同时,您可以加入一些使这部分更容易优化的内容。在</p>