好吧,所以我的头衔很糟糕。一个例子效果更好:
input = 'check yahoo.com'
我想解析输入,使用第一个单词作为“命令”,并将字符串的其余部分作为参数。这是我的非Pythonic思想编码的简单版本:
if len(input) > 0:
a = input.split(' ')
if a[0] == 'check':
if len(a) > 1:
do_check(a[1])
elif a[0] == 'search':
if len(a) > 1:
do_search(a[1])
我喜欢Python,因为它将通常很复杂的东西变成了相当简单的东西。我对它没有太多的经验,而且我相信有更好的方法来做这些事情...某种程度上更加诡异。我已经看到一些人用switchts和lambda函数替换switch语句的例子,而其他人只是推荐if..else嵌套。
答案 0 :(得分:31)
dispatch = {
'check': do_check,
'search': do_search,
}
cmd, _, arg = input.partition(' ')
if cmd in dispatch:
dispatch[cmd](arg)
else:
do_default(cmd, arg)
答案 1 :(得分:4)
我相当确定有更好的方法来做这些事情...某种方式更加pythonic。
不是真的。你的代码简单,清晰,明显,像英语一样。
我见过一些用dicts和lambda函数替换switch语句的例子,
是的,你已经看过他们了,他们不清楚,明显或类似英语。它们的存在是因为有些人喜欢在交换声明中绞尽脑汁。
而其他人只是推荐if..else巢。
正确。他们工作。它们简单明了,......
你的代码很好。不要管它。继续前进。
答案 2 :(得分:3)
这可以让你避免给每个命令名两次;函数名几乎直接用作命令名。
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 :(得分:0)
如果你正在寻找一种单线“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
答案 4 :(得分:0)
无视,我刚刚意识到我的答案与其他答案类似 - 显然没有删除密钥:)
答案 5 :(得分:0)
@MizardX's answer上的变化:
from collections import defaultdict
dispatch = defaultdict(do_default, check=do_check, search=do_search)
cmd, _, arg = input.partition(' ')
dispatch[cmd](arg)