<p>把它变成一个函数似乎为时过早,因为它的硬编码只能处理3个“文件”参数,即使修改为一个参数,它仍然绑定到<code>".Z"</code>扩展名。这使得它基本上只适用于一个超特定的任务:使用特定的扩展名解压<em>确切地</em>3个文件(真正的目录…)</p>
<p>此外,目录和文件路径之间似乎存在混淆<code>os.listdir</code>拉入目录中的所有文件,这似乎与您命名变量的方式相反,这表明您正在传递文件路径</p>
<p>无论哪种方式,您都可以删除函数中的多个块并将根文件夹传递给路径,或者相反,跳过<code>os.listdir</code>并为<code>subprocess.call</code>提供一个直接的单路径</p>
<p>我建议内联编写代码:</p>
<pre><code>for path in os.listdir('/root/xxx/'):
if path.endswith('.Z') and ret := subprocess.call(['gunzip', path]):
raise IOError(f'gunzip exited with code {ret} on {path}')
</code></pre>
<p>如果您真的经常这样做,以致对呼叫方来说太混乱,您可以使用:</p>
<pre><code>def unzip_all(directory, extension='.Z'):
for path in os.listdir(directory):
if path.endswith(extension) and ret := subprocess.call(['gunzip', path]):
raise IOError(f'gunzip exited with code {ret} on {path}')
</code></pre>
<p>如果您只想提取3个特定文件,而不是3个特定目录:</p>
<pre><code>for path in ['root/xxx/foo.Z', 'root/xxx/bar.Z', 'root/xxx/baz.Z']:
if ret := subprocess.call(['gunzip', path]):
raise IOError(f'gunzip exited with code {ret} on {path}')
</code></pre>
<p>由于<code>gunzip</code>接受多个参数,您可以利用这一点将整个过程归结为:</p>
<pre><code>paths = ['root/xxx/foo.Z', 'root/xxx/bar.Z', 'root/xxx/baz.Z']
if ret := subprocess.call(['gunzip'] + paths):
raise IOError(f'gunzip exited with code {ret} on {paths}')
</code></pre>
<p>注意,这使用了Python 3.8中的胡须分配语法<code>:=</code></p>
<p>顺便说一句</p>
<pre><code>else:
if:
....
</code></pre>
<p>是一种更复杂的写作方式</p>
<pre><code>elif:
....
</code></pre>
<p>我建议:;函数应该是<code>lower_camel_case</code><code>UpperCamelCase</code>是为类保留的</p>