函数定义后导入语句 - 如何使其更加pythonic?

时间:2011-01-26 08:46:59

标签: python refactoring import

我写了下面这段代码,我认为这很蹩脚:

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?

4 个答案:

答案 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.posixpathos.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_namesalso documented