Python inline elif可能吗?

时间:2011-01-06 11:01:13

标签: python if-statement python-3.x

'Hello ' + ('there' if name is None else name)

相当于

msg = 'Hello '
if name is None:
    msg += 'there'
else:
    msg += name

这相当于:

msg = 'Hello '
if name is None:
    msg += 'there'
elif name == 'Mr Anderson'
    msg += 'Neo'
else:
    msg += name

编辑:此处参考的是我想缩小的代码

srepr = '\'Modify '
if self.register == 'p':
    srepr += 'Pointer'
elif self.register == 'v':
    srepr += 'Value'
else
    srepr += 'Unknown'
srepr += ' By ' + str(self.delta) + '\''

7 个答案:

答案 0 :(得分:19)

msg = "Hi " + ("there" if not name else ("Neo" if name == "Anderson" else name))

但我认为那是非常难以理解的。

答案 1 :(得分:4)

使用字典执行映射:

srepr = "'Modify " + {"p": "Pointer", "v": "value"}.get(self.register, "Unknown")

(顺便说一下,您可以使用'\'...'代替"'...,以便更清晰。

答案 2 :(得分:1)

'Hello ' + \
('there' if name is None else \
    'Neo' if name == 'Mr Anderson' else \
    name)

我建议不要这样做;如果你的条件变得如此复杂,那就把它放在一个函数中。

答案 3 :(得分:1)

不要这样做。

请改为:

% python -m this | sed 's/^R.*/======>&<======/'

编辑:作为参考,以下是我将如何重构此代码......

每当我看到elif时,我认为dict

#!/usr/bin/env python

class Shrink(object):
    types = {
            'p': 'Pointer',
            'v': 'Value',
            }

    def shrink_this(self):
        return "'Modify %s By %s'" % (
                self.types.get(self.register, 'Unknown'), self.delta)

import unittest
class TestShrink(unittest.TestCase):

    def test_p(self):
        s = Shrink();
        s.register = 'p'
        s.delta = 'delta'
        self.assertEquals("'Modify Pointer By delta'", s.shrink_this())

    def test_u(self):
        s = Shrink();
        s.register = 'u'
        s.delta = 'echo'
        self.assertEquals("'Modify Unknown By echo'", s.shrink_this())

    def test_v(self):
        s = Shrink();
        s.register = 'v'
        s.delta = 'foxtrot'
        self.assertEquals("'Modify Value By foxtrot'", s.shrink_this())

if __name__ == '__main__':
    unittest.main()

您是否需要为r添加referencepp添加pointer-to-pointer,只有types需要更改,您的代码仍然可读。

  

可读性计数。

答案 4 :(得分:0)

你也可以这样做:

msg= 'Hello ' + {name is None: 'there', name == 'Mr Anderson': 'Neo'}.get(True, name)

因此name is Nonename == 'Mr Anderson'中的任何一个都是True,或者它们都不是True,那么将使用name

答案 5 :(得分:0)

msg = 'Hello ' + (
    'there' if name is None else
    'Neo' if name == 'Mr Anderson' else
    name
)

这是其他几个答案的重复,但格式更好。我认为这是最具可读性的,这是我将使用的方法。

答案 6 :(得分:-1)

首先,运行'pip install pyswitch'

然后:

import pyswitch

mySwitch = pyswitch.Switch()

@mySwitch.case(None):
def gotNone(value):
    return 'Hello there'

@mySwitch.case('Mr. Anderson')
def gotMrAnderson(value):
    return 'Hello Neo'

@mySwitch.default
def gotDefault(value):
    return 'Hello %s' % value

msg = mySwitch.switch(None)  # Returns 'Hello there'
msg = mySwitch.switch('Mr. Anderson')  # Returns 'Hello Neo'
msg = mySwitch.switch('OoglyMoogly')  # Returns 'Hello OoglyMoogly'