为了我的研究,我一直在使用python进行计算。为了清理我糟糕的代码,我一直在阅读davidgoodger的Code Like a Pythonista: Idiomatic Python。在
在本文中,Goodger建议不要使用“通配符”导入表单
from module import *
我的代码使用了很多这样的代码。我想清理我的代码,但我不知道如何清理。我很好奇是否有一种方法可以检查我在代码中使用了module
中的名称。这样我就可以显式地导入这些名称,或者用module.name
替换这些名称。有没有专门设计的工具来完成这样的任务?在
概述
一种方法是:
*
方法导入的每个模块sys.modules[<module>].__dict__
中,则进行搜索和替换,其中{a1}中的对象来自Python模块。在亲自查看
sys.modules
的实际操作:您可以使用
if <function_name> in sys.modules[<module>].__dict__
手动检查是否出现您不确定的函数名,也可以编写一个整洁的自动脚本,遍历sys.modules[<module>]
中的每个条目。在我倾向于后者来处理任何过于复杂的问题,而前者用于诊断目的。在
自动工具的粗略实现
一个非常、非常、非常快速和肮脏的示例,说明如何编写这样一个自动化脚本:
^{pr2}$这不是很健壮,你不应该按原样使用它!您可能会发现自己正在重写模块中定义的名称。在
最好允许某种形式的用户交互来确认您希望为找到的每个函数名应用更改。但它能让人理解要点。在
使用以下简单的示例文件对此进行了测试:
变成
^{4}$编辑:此后,我创建了一个更加健壮和有用的命令行实用程序here
这里有一个更简单的解决方案。它使用ast模块将代码从文件中剥离出来,然后将其与inspect模块找到的可用函数列表进行比较。只需在运行之前替换yourfilename和yourmodulename。在
我的脚本和我的脚本检查了几十行。在
Edit:添加了检查,以确保它只列出实际属于所需模块一部分的函数,而不是它的子模块。另外,修改后使其同时列出要导入的类和函数。在
使用
pyflakes
(无论如何都应该使用它)这样的工具来注意在将from module import *
替换为import module
之后,代码中的哪些名称将变得未定义。一旦确定了从module
导入的名称的每个实例,就可以评估是否要module
导入的import module
和{x
。在import module as m
和{module
有选择地将一些名称从module
导入到模块命名空间中以上三个并不互斥;作为一个极端的例子,您可以在同一个模块中使用这三个:
都在同一个代码里。(我不建议在同一个模块中同时使用这三个模块。在单个模块中使用完整的模块名或别名,但直接导入常见的、明显的名称并使用完全限定名来处理更模糊的模块属性是没有坏处的。)
相关问题 更多 >
编程相关推荐