[英]How to make if-elif conditionals shorter for parsing
我正在嘗試制作一個程序,以在某些用戶輸入上執行某些任務,例如遞增或遞減整數,向字符串添加字符(charachter)等。
用戶可以在同一行中給出多個命令。
當我使用raw_input
,我不能(也不想)接受多行輸入。
是否可以使if-elif-else
條件條件更短,並保持可讀性呢?
for i in test_str:
if i == '[':
a += 1
elif i == '(':
b += 1
elif i == ']' and c > 0:
c -= 1
elif i == ')'and d > 0:
d -= 1
elif c == 0 and d == 0:
ret += i
... # more elifs
像這樣的elif
也有可能:
elif i == 'o':
if test_str[test_str.index(i)+1] == i: # next char is same
# handle
else:
# handle
我正在使用它進行解析。
如果要減少代碼使用的行數,則只需在一行上使用if - elif - else
語句即可。
if i == '[':
a += 1
elif i == '(':
b += 1
elif i == ']' and c > 0:
c -= 1
elif i == ')'and d > 0:
d -= 1
elif c == 0 and d == 0:
ret += i
成為:
if i == '[': a += 1
elif i == '(': b += 1
elif i == ']' and c > 0: c -= 1
elif i == ')'and d > 0: d -= 1
elif c == 0 and d == 0: ret += i
但是,您應該更改正在使用的邏輯,而不是這樣做。
首先,您應該使用一個函數,我也建議您使用某種映射。
例:
d = {
'[' : ('add', a, 1),
'(' : ('add', b, 1),
']' : ('method', my_method, ['sample_arg1', 'sample_arg2'], {'sample_kwarg' : 'sample value'})}
def check_char(char, mapping):
mapper = d.get(char, None)
if mapper:
if mapper[0] == 'add':
mapper[1] += mapper[2]
if mapper[0] == 'subtract':
mapper[1] -= mapper[2]
if mapper[0] == 'method':
mapper[1](char, mapper[2], mapper[3])
# you get the idea....
def my_method(char, *args, **kwargs):
# deal with char....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.