Pythonize if / else

时间:2011-07-29 16:19:33

标签: python

我的思绪可能在周五下午感觉到,我无法看到一种方法来对下面的代码进行pytonize:

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:上面的代码只是一个例子,它可能有语法错误,因为我直接在这里写了。

3 个答案:

答案 0 :(得分: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

此外,它还允许您添加更多路径以便轻松检查。

答案 1 :(得分: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

答案 2 :(得分: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 并返回结果值。