我已经结束了很多我在项目中使用的小函数和代码片段。
例如,围绕库执行常见任务的包装器:
def DownloadFile(url, filename):
output = open(filename,'wb')
output.write(urllib.request.urlopen(url).read())
output.close()
或者,一种快速捕获和忽略错误的方法:
def deleteFile(f):
if f == "":
pass
else:
try:
os.remove(f)
except:
print("Cant delete ",f)
我有很多这些功能,我用
来调用它们sys.path.append('../../blah')
import lib_file as fle
我的问题是,处理这个问题的首选方法是什么:
a)将它们放入适当的库并导入
b)熟练使用标准Python库,因此您不需要包装器
c)还有另一种方法可以重新使用Python代码段吗? (除了复制粘贴)
答案 0 :(得分:1)
我使用版本控制处理了这个问题;就我而言,Mercurial。
假设我有这样的目录结构:
Projects\python\ general_libs\ .hg __init__.py acldict.py easy_csv.py easy_tar.py fake_file.py list_extract.py state_machine.py tag_extract.py timeout.py user_agents.py scraper_libs\ .hg __init__.py something_else.py py_prog\ libs\
我正在编写一个名为py_prog
的程序。我希望使用库general_libs
和scraper_libs
中的代码,但我希望该方法能够维护“副本”和原始位置之间的“链接”。
在这种情况下,general_libs
和scraper_libs
都是mercurial存储库。
Mercurial(和git)提供clone
命令。此命令将源存储库克隆到(如果没有另外指定)当前目录。使用克隆的存储库,您可以在原始存储库中推送和提取更新,而无需重新复制或覆盖。
在控制台中导航到Projects\python\py_prog\libs
我运行mercurial命令:
Projects\python\py_prog\libs> hg clone ..\..\general_libs Projects\python\py_prog\libs> hg clone ..\..\scraper_libs
目录结构现在看起来像:
Projects\python\ general_libs\ .hg __init__.py acldict.py easy_csv.py easy_tar.py fake_file.py list_extract.py state_machine.py tag_extract.py timeout.py user_agents.py scraper_libs\ .hg __init__.py something_else.py py_prog\ py_prog.py libs\ general_libs\ .hg __init__.py acldict.py easy_csv.py easy_tar.py fake_file.py list_extract.py state_machine.py tag_extract.py timeout.py user_agents.py scraper_libs\ .hg __init__.py something_else.py
现在我可以在不更改系统路径的情况下导入这些库函数。
py_prog.py:
from libs.scraper_libs.something_else import something
或者,您可以使用符号链接(在* nix中)或交接点(在Windows中)实现类似的结果(尽管没有修订控制的其他好处)。