“Pythonic”, эквивалентный для обработки переключателя и несколько представляют в виде строки, выдерживает сравнение

Вызов ss.readByteArray() считывает все тело в байтовый массив. Вы хотели сделать ss.readByteArray(bufSize)?

8
задан Tom 13 March 2009 в 04:31
поделиться

6 ответов

dispatch = {
  'check': do_check,
  'search': do_search,
}
cmd, _, arg = input.partition(' ')
if cmd in dispatch:
    dispatch[cmd](arg)
else:
    do_default(cmd, arg)
31
ответ дан 5 December 2019 в 04:55
поделиться

Я абсолютно уверен, что существует намного лучший способ сделать эти вещи... некоторый путь больше pythonic.

Не совсем. Вы кодируете, просто, ясен, очевиден и подобен английскому языку.

Я видел некоторые примеры людей, заменяющих операторы переключения dicts и функциями лямбды,

Да, Вы видели их, и они не ясны, очевидны или подобны английскому языку. Они существуют, потому что некоторым людям нравится воздевать их руки по оператору переключения.

в то время как другие люди просто рекомендовали если.. еще вложенные множества.

Корректный. Они работают. Они просты, ясны...

Ваш код хорош. Оставьте его в покое. Движение.

4
ответ дан 5 December 2019 в 04:55
поделиться

Это позволяет Вам постараться не давать каждое название команды дважды; имена функций используются почти непосредственно в качестве названий команды.

class CommandFunctions:
    def c_check(self, arg):
        print "checking", arg

    def c_search(self, arg):
        print "searching for", arg

    def c_compare(self, arg1, arg2):
        print "comparing", arg1, "with", arg2

    def execute(self, line):
        words = line.split(' ')
        fn = getattr(self, 'c_' + words[0], None)
        if fn is None:
            import sys
            sys.stderr.write('error: no such command "%s"\n' % words[0])
            return
        fn(*words[1:])

cf = CommandFunctions()
import sys
for line in sys.stdin:
    cf.execute(line.strip())
3
ответ дан 5 December 2019 в 04:55
поделиться

При поиске одного лайнера 'pythonic' подход к этому, можно использовать это:


def do_check(x): print 'checking for:', x
def do_search(x): print 'searching for:', x

input = 'check yahoo.com'
{'check': do_check}.get(input.split()[0], do_search)(input.split()[1])
# checking for: yahoo.com

input = 'search google.com'
{'check': do_check}.get(input.split()[0], do_search)(input.split()[1])
# searching for: google.com

input = 'foo bar.com'
{'check': do_check}.get(input.split()[0], do_search)(input.split()[1])
# searching for: bar.com
0
ответ дан 5 December 2019 в 04:55
поделиться

Игнорирование, я просто понял, что мой ответ был подобен одному из других ответов - и по-видимому нет никакой клавиши Delete :)

0
ответ дан 5 December 2019 в 04:55
поделиться

Вариант ответа @ MizardX :

from collections import defaultdict

dispatch = defaultdict(do_default, check=do_check, search=do_search)
cmd, _, arg = input.partition(' ')
dispatch[cmd](arg)
0
ответ дан 5 December 2019 в 04:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: