2011-07-29 11 views
1

私の心はおそらく金曜日の午後を感じていると私は以下のコードをpytonizeする方法を参照することはできません。Pythonize場合/他

filepath = None 
if 'HALLO' in os.environ: 
    filepath = os.environ['HALLO'] 
elif os.path.isfile(os.path.join(os.environ['HOME'], 'host.hallo')): 
    filepath = os.path.join(os.environ['HOME'], 'host.hallo') 
elif os.path.isfile('/etc/app/host.hallo'): 
    filepath = '/etc/app/host.hallo' 
if filepath: 
    print 'HALLO found in "%s"' % filepath 
    ## do something 
else: 
    print 'HALLO not found!' 
    ## do something else 

それを行う方法上の任意のアイデアを?ありがとう!

ps:上のコードは単なる例であり、ここで直接記述しているため、構文エラーが発生する可能性があります。

+0

* pytonize *とはどういう意味ですか?それをもっと「ピジョン的な道」で書くのですか? –

+0

はい、 "pythonic way" – Cinquo

答えて

0
home_hallo = os.path.join(os.environ['HOME'], 'host.hallo') 
filepath = (('HALLO' in os.environ and os.environ['HALLO']) or 
      (os.path.isfile(home_hallo) and home_hallo) or 
      (os.path.isfile('/etc/app/host.hallo') and '/etc/app/host.hallo')) 
if filepath: 
    print 'HALLO found in "%s"' % filepath 
    ## do something 
else: 
    print 'HALLO not found!' 
    ## do something else 

ここでは概要であり、Boolean operations上のドキュメントを参照してください:

表現xとyの最初のXを評価しては、 xがfalseの場合、その値が返されます。そうでない場合はyが評価され、結果の値が返されます。

xまたはyは、まずxを評価します。 xがtrueの場合、その値が返されます。そうでない場合はyが評価され、結果の値が返されます。

+0

これは、元のコードよりも読むのがずっと難しく、維持するのが難しいです。短い方が良いわけではありません。 –

+0

Ferdinand Beyerと完全に同意します。これは確かにこのページの無回答の答えは少ないです。 – GaretJax

10

これはかなりうまく動作するはずです:

paths = [ 
    os.environ.get('HALLO', None), 
    os.path.join(os.environ['HOME'], 'host.hallo'), 
    '/etc/app/host.hallo', 
] 

for path in paths: 
    if path and os.path.isfile(path): 
     break 
else: 
    # Handle no path 
    pass 

# Use path here 

さらに、それはあなたが簡単にチェックするためのより多くのパスを追加することができます。それが明確でない場合は、この作業の理由

+0

ええ、私はこの解決策がOPによって受け入れられたものよりも好きです。しかし、私はちょっとしたことを追加します: '/etc/app/host.hallo'の後にコンマを入れてください。 Pythonはそれを可能にし、新しいエントリを少し追加するだけでなく、エラーの起こりやすいリストの並べ替えを容易にします。 –

+0

@ジョンゲインズジュニア:完了。 ;) – GaretJax

3

あなたは最初の非ゼロfilepathを探していますか? any()を使用してください。また、リスト理解/ジェネレータの式を使用してos.path.isfileを除外することもできます。

filepath = any(filename 
       for filename 
       in (os.environ.get('HALLO'), 
        os.path.join(os.environ['HOME'], 'host.hallo'), 
        '/etc/app/host.hallo') 
       if os.path.isfile(filename)) 

if filepath: 
    print 'HALLO found in "%s"' % filepath 
    ## do something 
else: 
    print 'HALLO not found!' 
    ## do something else