我最近的任务是审核我的团队在整个生产代码库中使用的所有python模块。你知道吗
我得出了以下结论:
find ~/svn/ -name *.py
| xargs grep -hn "^import\|^from"
| awk -F ":" '{print $2}'
| awk '{if (/from/) print $2; else {$1 = ""; print $0} }'
| sed 's/,\| /\n/g'
| sort
| uniq > /tmp/pythonpkgs.txt
按顺序,它
import
或from
开头的行:
字符并使用后面的内容,因此不包括文件名和输出编号from foo import bar
,则打印foo
,否则如果行的形式为import foo
,则打印foo
import a, b, c
我自己把它拼凑起来的,但我想会更好。你会怎么做?合并awk
s?你知道吗
很聪明的设置开始,但有几个地方可以清理:
第3行:您不需要第一次awk剥离/打印,只需在grep上不包含
-n
,这样就不会在输出中包含行号。你知道吗第6-7行和第4-5行:如果有很多重复行,可以在运行
awk
和sed
之前通过sort
和uniq
-ing来加快执行速度请注意,这将丢失PEP 0328中描述的多行导入。对这些导入的支持将使regex搜索变得相对简单,因为您必须寻找可选的括号并注意前面的空白。你知道吗
为特定的构造编写源代码是非常脆弱的,在很多情况下可能会失败。例如,考虑:
或者
或者
等等
如果您对一种更健壮的方法感兴趣,这就是如何使用python自己的编译器可靠地解析导入的名称:
用法:
以下是我的综合awk:
呼叫方式:
如前所述,它不考虑一些潜在的情况,例如用“;”连接的行或用“\”拆分的行,或用“()”分组的行,但它将覆盖大多数Python代码。你知道吗
相关问题 更多 >
编程相关推荐