Возможен ли Python inline elif? - PullRequest
11 голосов
/ 06 января 2011
'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 ]

20 голосов
/ 06 января 2011
msg = "Hi " + ("there" if not name else ("Neo" if name == "Anderson" else name))

Я думаю, что это довольно нечитаемо, хотя.

5 голосов
/ 07 января 2011

Используйте словарь для сопоставления:

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

(кстати, вместо '\'...' вы можете использовать "'... для большей ясности.

1 голос
/ 25 марта 2017
msg = 'Hello ' + (
    'there' if name is None else
    'Neo' if name == 'Mr Anderson' else
    name
)

Это повторение нескольких других ответов, но с более приятным форматированием. Я считаю это наиболее читабельным, и именно такой подход я бы использовал.

1 голос
/ 06 января 2011

Не делайте этого.

Сделайте это вместо:

% 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 для reference или pp для pointer-to-pointer, только types требует измененияи ваш код остается читабельным.

Читаемость имеет значение.

1 голос
/ 06 января 2011
'Hello ' + \
('there' if name is None else \
    'Neo' if name == 'Mr Anderson' else \
    name)

Я рекомендую против этого;если ваши условия становятся такими сложными, вставьте их в функцию.

0 голосов
/ 22 ноября 2016

Вы также можете сделать это:

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

Таким образом, либо name is None, либо name == 'Mr Anderson' будет True, либо ни один из них не будет True, тогда будет использоваться name.

0 голосов
/ 07 января 2011

Во-первых, запустите '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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...