我写了下面这段代码,我认为这很蹩脚:
def findfile1(wildcard):
"""Returns path of the first matched file. Using win32file.
>>> findfile1("D:\\Python26\\*.exe")
'D:\\Python26\\python.exe'
"""
return filepath
def findfile2(wildcard):
"Same as above, but using glob."
return filepath
try:
import win32file
findfile = findfile1
except ImportError:
import glob
findfile = findfile2
if __name__ == '__main__':
f = findfile('D:\\Python26\\*.exe')
在导入所需模块之前定义函数,整体结构对我来说似乎有点奇怪。
此类问题的常见方法是什么?我怎样才能让它更加pythonic?
答案 0 :(得分:4)
如何将功能放在两个不同的模块中?
module1
:
import win32file
def findfile(wildcard):
"""Returns path of the first matched file. Using win32file.
>>> findfile1("D:\\Python26\\*.exe")
'D:\\Python26\\python.exe'
"""
return filepath
module2
:
import glob
def findfile(wildcard):
"Same as above, but using glob."
return filepath
主程序:
try:
from module1 import findfile
except ImportError:
from module2 import findfile
答案 1 :(得分:4)
try:
import win32file
except ImportError:
win32file = None
import glob
if win32file:
def findfile(wildcard):
"""Returns path of the first matched file. Using win32file."""
...
return filepath
else:
def findfile(wildcard):
"""Returns path of the first matched file. Using glob."""
...
return filepath
答案 2 :(得分:1)
try:
import win32file
def findfile(wildcard):
"""Returns path of the first matched file. Using win32file.
>>> findfile1("D:\\Python26\\*.exe")
'D:\\Python26\\python.exe'
"""
return filepath
except ImportError:
import glob
def findfile(wildcard):
"Same as above, but using glob."
return filepath
答案 3 :(得分:0)
标准os
模块为os.path
(简短版)执行此操作的方式:
import sys
__all__ = ['path']
_names = sys.builtin_module_names
if 'posix' in _names:
import posixpath as path
elif 'nt' in _names:
import ntpath as path
elif 'os2' in _names:
#...
else:
raise ImportError, 'no os specific module found'
在您的情况下,您可以将每个操作系统不同的功能放在每个操作系统的一个模块中,并为所有功能执行一次导入解决方案。与其他答案的区别在于,分辨率是基于每个模块一次完成的,它不依赖于捕获ImportError
,并且每个特定于操作系统的模块的导入将是他们必须做什么。
因为os.posixpath
和os.ntpath
的存在是documented,所以最好将问题解决为。
import os.path
__all__ = ['utils']
if os.path.__name__ == 'posixpath':
import myposixutils as utils
elif os.path.__name__ == 'ntpath':
import myntutils as utils
else:
raise ImportError, 'no os specific module found'
注意:buitin_module_names
为also documented。