Python内联elif可能吗?

2024-05-14 11:13:51 发布

您现在位置:Python中文网/ 问答频道 /正文

'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) + '\''

Tags: nameselfnoneregisterhelloifismsg
3条回答

不要这样做。

请改为:

% 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()

如果需要为reference添加r,或者为pointer-to-pointer添加pp,则只有types需要更改,并且代码保持可读性。

Readability counts.

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

不过,我觉得那很难读。

使用字典执行映射:

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

(顺便说一下,您可以使用"'...来获得更清晰的信息,而不是'\'...'

相关问题 更多 >

    热门问题