<p><code>['raj' and 'esh']</code>是一个单元素数组,其唯一元素是<code>'raj'</code>和<code>'esh'</code>的结果<code>and</code>如果是falsy,则计算第一个操作数,否则计算第二个操作数。因为第一个操作数不是假操作数,所以得到<code>'esh'</code></p>
<p>代码中的行不是一个简单的数组,它是一个<em>理解</em>——基本上是编写构造数组的循环的短方法。理解的一般语法是</p>
<pre><code>[x for y in z if p]
</code></pre>
<p>如果<code>y</code>将循环遍历iterable <code>z</code>的所有元素,请检查<code>p</code>是否为true,如果为true,请将<code>x</code>添加到结果中。在您的例子中,条件(<code>p</code>)是</p>
<pre><code>not o.startswith('.')
and
(extensions is None or f'.{o.split(".")[-1].lower()}' in extensions)
</code></pre>
<p>对于<code>f</code>的每个元素<code>o</code>(可能是一个文件名的iterable),如果这个条件为真,结果列表将获得一个元素,该元素由路径<code>p</code>与文件名<code>o</code>(如果乍一看很惊讶,那么<code>/</code>是一个自然的路径连接运算符)组成</p>
<p>代码段中显示的错误命名使问题更加复杂。考虑一下重写:</p>
<pre><code>def _hidden(filename):
return filename.startswith('.')
def _extension(filename):
return '.' + filename.split(".")[-1].lower()
def _extension_ok(filename, allowed_extensions=None):
return allowed_extensions is None
or _extension(filename) in allowed_extensions
def _get_files(parent, path, filenames, allowed_extensions=None):
path = Path(path)
good_paths = [path/filename for filename in filenames
if not _hidden(filename)
and _extension_ok(filename, allowed_extensions)]
return good_paths
</code></pre>
<p>现在,它读起来几乎像英语,并且非常清楚它在做什么(唯一不可靠的部分是<code>path/filename</code>,几乎任何人都可以通过与UNIX路径的类比猜到这可能是什么)</p>