【问题标题】:Python inline elif possible?Python内联elif可能吗?
【发布时间】:2011-06-04 14:12:01
【问题描述】:
'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) + '\''

【问题讨论】:

  • srepr+={'p': 'Pointer', 'v': 'Value'}.get(self.register,'Unknown')

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


【解决方案1】:
msg = "Hi " + ("there" if not name else ("Neo" if name == "Anderson" else name))

不过,我认为这很不可读。

【讨论】:

  • 你有不必要的括号,这会降低可读性。请参阅我的答案以获得更清晰的解决方案。
  • @glenn。我添加了这些括号以使其更具可读性,但我想这是主观的。无论如何,我认为我们都同意没有人应该写任何类似的东西。
  • 不错的答案 - 但如果我在生产代码库中看到这个,我将度过漫长的一天。 :P
【解决方案2】:
msg = 'Hello ' + (
    'there' if name is None else
    'Neo' if name == 'Mr Anderson' else
    name
)

这是对其他几个答案的重申,但格式更好。我认为这是最易读的,这是我将使用的方法。

【讨论】:

    【解决方案3】:

    你也可以这样做:

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

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

    【讨论】:

      【解决方案4】:

      使用字典执行映射:

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

      (顺便说一句,您可以使用"'... 代替'\'...' 以获得更清晰的信息。

      【讨论】:

        【解决方案5】:

        首先,运行“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'
        

        【讨论】:

        • 随着您的“elif”链的长度增加,该解决方案的吸引力也在增加。它基本上类似于 Python 的 C 语言 switch 语句。见pypi.python.org/…
        • 如果涉及到这一点,可以只使用带有案例作为键的字典,并可能使用 lambda 函数作为值。比pyswitch 简单得多,即使在大数据中也是如此。
        【解决方案6】:

        不要这样做。

        改为这样做:

        % 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 需要更改并且您的代码仍然可读。

        可读性很重要。

        【讨论】:

        • 哎哟。为什么投反对票? 《Python 之禅》是任何 Python 程序员(连同 PEP008)的重要读物。 sed 命令强调了这一点。
        • 问题是 Python 3.x。使用return "'Modify {} By {}'".format( self.types.get(self.register, 'Unknown'), self.delta)
        • 第二次投反对票:“如果您看到错误信息,请投下反对票。添加 cmets 以指明具体是什么错误。提供您自己的更好答案。最重要的是 - 编辑和改进现有的问题和答案!” --诚实,所以常见问题解答 stackoverflow.com/faq>
        【解决方案7】:
        'Hello ' + \
        ('there' if name is None else \
            'Neo' if name == 'Mr Anderson' else \
            name)
        

        我建议不要这样做;如果您的条件变得如此复杂,请将其粘贴到函数中。

        【讨论】:

        • 这是我将使用的方法,但正如这里所写,格式会产生不必要的噪音。请参阅我的答案以获得没有反斜杠且具有一致缩进的版本。
        猜你喜欢
        • 1970-01-01
        • 2011-12-02
        • 2013-01-25
        • 1970-01-01
        • 1970-01-01
        • 2013-10-24
        • 2022-11-23
        • 1970-01-01
        • 2021-06-30
        相关资源
        最近更新 更多