2011-01-26 12 views
1

は、私は次のコードを書いて、私はそれはラメだと思う:必要なモジュールをインポートする前に、関数定義の後のインポートステートメント - どのようにもっとpythonicにすることができますか?

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

グロスモジュールをWindowsで使用しない理由はありますか? – Mew

答えて

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回行われ、関数が呼び出されるたびに行われるべきではありません。 –

+3

'try'ブロックをそのままにしておき、' if'ブロックの中で関数定義を動かすことができます。私のお金のために、それはおそらく最善の解決策です。 – aaronasterling

+0

@Space、私はAaronの提案を使用するように切り替えました –

4

機能を2つの異なるモジュールに入れるのはどうですか?

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 
+0

ありがとう!メインプログラムはもっときれいに見えますが、小さなユーティリティモジュールを配置するのは難しいですか? –

+2

プログラム全体が本当に小さければ、私は通常それをモジュールに分けることはできません。 「Pythonic」はこの文脈ではあまり意味がありません。 (たぶんそれはどんな文脈でもあまり意味がありません)。 –

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 
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' 

、あなたはOSごとに一つのモジュールでOSごとに異なる機能を配置し、一回の輸入解決を行うことができますすべての機能。他の答えとの違いは、モジュールごとにを一度だけ解決したことであり、それはImportErrorをキャッチすることに依存せず、各OS固有のモジュールのインポートが必要であるということです。 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です。

関連する問題