11

我已经在一个项目下安装了 Google yapf(又一个 python 格式化程序)并尝试就地格式化我所有的 python 文件,但是我得到了以下错误:

$ yapf -i -r files **.py
yapf: Input filenames did not match any python files

为什么 yapf 无法理解模式?我应该怎么做才能达到同样的目的?

编辑我也按照建议尝试了 yapf -ir 但我得到了:

$ yapf -ir
usage: yapf [-h] [-v] [-d | -i] [-r | -l START-END] [-e PATTERN]
            [--style STYLE] [--style-help] [--no-local-style] [-p] [-vv]
            [files [files ...]]
yapf: error: cannot use --in-place or --diff flags when reading from stdin

这很奇怪,因为我没有从标准输入读取

4

1 回答 1

26

第一个问题是通配符扩展发生在 shell 中,甚至在命令行执行之前。当你运行时:

somecommand *.py

该命令不知道您输入了*. 它只知道你传入了一个文件列表。换句话说,yapf它无法理解模式,因为它从未看到模式。

第二个问题是它**不是一个有效的 shell 文件通配模式。这在语义上等同于*,因此运行yapf -ir files **.py只会处理.py当前目录和目录中包含的任何文件files

如果您想yapf在所有 Python 文件上递归运行,从当前目录开始,有一些解决方案。最简单的大概是:

yapf -ir .

这将处理.py当前目录及其子目录中的所有文件。如果您想更好地控制文件的选择,请使用findand xargs

find . -name '*.py' -print0 | xargs -0 yapf -i
于 2018-11-18T04:21:32.300 回答