擅长:python、mysql、java
<p>它不是很Pythonic,但是如果您确实必须这样做,您可以像这样实现<code>compact()</code>:</p>
<pre><code>import inspect
def compact(*names):
caller = inspect.stack()[1][0] # caller of compact()
vars = {}
for n in names:
if n in caller.f_locals:
vars[n] = caller.f_locals[n]
elif n in caller.f_globals:
vars[n] = caller.f_globals[n]
return vars
</code></pre>
<p>以前可以像这样实现<code>extract()</code>,但在现代Python解释器中,这似乎不再有效了(实际上,这并不是说它曾经“被认为”有效,而是2009年的实现中有一些怪癖让您得以逍遥法外):</p>
<pre><code>def extract(vars):
caller = inspect.stack()[1][0] # caller of extract()
for n, v in vars.items():
caller.f_locals[n] = v # NEVER DO THIS - not guaranteed to work
</code></pre>
<p>如果您真的觉得需要使用这些函数,那么您可能是在用错误的方式做某些事情。它似乎至少在三个方面与<a href="https://www.python.org/dev/peps/pep-0020/" rel="nofollow noreferrer">Python's philosophy</a>相悖:“显式优于隐式”,“简单优于复杂”,“如果实现很难解释,这是一个坏主意”,也许更多(而且,如果你有足够的Python经验,你知道这样的事情根本做不到)。我可以看到它对于调试器或事后分析非常有用,或者对于某种通常需要创建具有动态选择的名称和值的变量的<em>非常通用的</em>框架非常有用,但这是一种延伸</p>