回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我不知道我应该去多详细,所以请要求详细说明,如果这是太简洁了。你知道吗</p>
<p>有没有一种方法可以把<code>for a,b,c in product(d['a'],d['b'],d['c']):</code>打包成语法糖,这样我就只需要为这个循环本身键入一次静音变量<code>a,b,c</code>?你知道吗</p>
<p>像这样的事情可能是?你知道吗</p>
<pre><code>my_for_loop('a','b','c'):
API_Call1(a)
API_Call2(b,c)
</code></pre>
<p>而不是</p>
<pre><code>for a,b,c in product(d['a'],d['b'],d['c']):
API_Call1(a)
API_Call2(b,c)
</code></pre>
<p><code>my_for_loop</code>会是什么样子?我对如何从概念上处理这个问题有点迷茫。你知道吗</p>
<p>更多细节:</p>
<p>我有一个API,它要求为某些列表的笛卡尔积的每个单元格调用它。我使用乘积函数来避免嵌套循环。假设我们有一个列表1和一个列表2,它可以通过以下方式完成</p>
<pre><code>from itertools import product
for a,b in product(list1,list2):
API_Call(a,b)
</code></pre>
<p>我创建了一个<code>dictionary_of_lists={'a':list1,'b':list2,'c':list3...}</code>
能够这样写</p>
<pre><code>for a,b in product(dictionary_of_lists['a'],dictionary_of_lists['b']):
API_Call(a,b)
for c,b in product(dictionary_of_lists['c'],dictionary_of_lists['b']):
API_Call(c,b)
for e,f,g,h in product(dictionary_of_lists['e'],dictionary_of_lists['f'],dictionary_of_lists['g'],dictionary_of_lists['h'],):
API_Call1(e,f,g,h)
API_Call2(e,h)
...
</code></pre>
<p>因此,循环创建的变量基本上是在API调用中使用的,它们是静音的,否则,它们的名称无关紧要。这些调用有很多,而且有一些复杂的逻辑围绕着它们。所以我想保持循环本身的简单性,如果我需要更改变量,我不必在每个循环的三个位置更改它们。你知道吗</p>
<pre><code>my_for_loop('a','b'):
API_Call(a,b)
my_for_loop('b','c'):
API_Call(c,b)
my_for_loop('e','f','g','h'):
API_Call1(e,f,g,h)
API_Call2(e,h)
...
</code></pre>
<p>附加:
我已经简化了一些事情,但却惊讶地发现其中隐藏着模棱两可的地方:-)</p>
<p>感谢所有的答案到目前为止!你知道吗</p>
<p>这是一个很好的建议,有D产品包装。我有一个确实,只是不想抢先你的建议。你知道吗</p>
<p>变量名对于代码逻辑是静音的,但是为了维护代码,它们有一些含义。所以它们不能由一个字母组成。你知道吗</p>
<p>为了进一步澄清:我希望避免在“for…”部分、对dproduct wrapper的调用和API调用中使用变量名三次。两次-在对包装器的调用和在API中调用都是可以的,因为它反映了逻辑。你知道吗</p>
<p>下面是一个更详细的代码示例。你知道吗</p>
<pre><code>def dproduct(d, keys):
subset_d = dict((k, d[k]) for k in keys if k in d)
return product(*[subset_d.values()])
for foo, bar in dproduct(d, ['foo','bar',]):
some logic here
if API_Call1(foo,bar) == 123:
some other stuff, API_Call6(quux,baz,)
some more stuff and a call to another dproduct
for quux, sl, baz in dproduct(d, ['quux','sl','baz',]):
blah blah, API_Call2(quux,sl,baz)
other stuff
for pa, mf in dproduct(d, ['pa','mf',]):
API_Call4(pa,mf)
for quux, sl, baz in dproduct(d, ['quux','sl','baz',]):
further logic
if API_Call1(quux, sl, baz) == 342: some other stuff
some more stuff and a call to another dproduct
for pa,mf in dproduct(d, ['pa','mf',]):
API_Call3(pa,mf)
</code></pre>