2010-10-20 15 views
7

Olası Çoğalt:
Replacements for switch statement in python?Python bir anahtar deyiminde bulunmadığından neyi kullanmalıyım?

Python içinde küçük bir konsol tabanlı uygulama yapıyorum ve bir menü seçimi kullanıcılar seçim işlemek için bir geçiş deyimi kullanmak istedi.

Ne kullanacağımı önerirsiniz. Teşekkürler!

+0

Bunların çoğaltılması: http://stackoverflow.com/search?q=%5Bpython%5D+switch. –

+0

Ayrıca bakınız soru [python'daki anahtar durumu çalışmıyor; başka bir desene ihtiyacım var] (http://stackoverflow.com/questions/3886641/switch-case-in-python-doesnt-work-need-another-pattern/3893242#3893242). – martineau

cevap

7

Sevk tablolar, daha doğrusu sözlükleri.

Siz anahtar kelimesini eşleştirin aka. fonksiyonlar performans gösteren menü seçimi değerleri söz konusu seçimler:

def AddRecordHandler(): 
     print("added") 
def DeleteRecordHandler(): 
     print("deleted") 
def CreateDatabaseHandler(): 
     print("done") 
def FlushToDiskHandler(): 
     print("i feel flushed") 
def SearchHandler(): 
     print("not found") 
def CleanupAndQuit(): 
     print("byez") 

menuchoices = {'a':AddRecordHandler, 'd':DeleteRecordHandler, 'c':CreateDatabaseHandler, 'f':FlushToDiskHandler, 's':SearchHandler, 'q':CleanupAndQuit} 
ret = menuchoices[input()]() 
if ret is None: 
    print("Something went wrong! Call the police!") 
menuchoices['q']() 

girişinizi doğrulamak için unutmayın! :)

+3

Bu kod çok seksi Ben iç çamaşırı vermek ve Playboy üzerinde poz vermek istiyorum. +1 –

+0

(1) Btw, 'menu_choices'daki the_input, gerçek seçimlerle eşleşmesi garantilenmiş ucuz bir onaylamadır. (2) Tüm örnek işleyicileri 'Hiçbiri' döndürür, bu yüzden örnekte çalıştıktan sonra polisi rahatsız etmeyin;) (3) Her zaman olduğu gibi, Python 2'de 'input 'yerine' raw_input' kullanın. – delnan

10

İki seçenek vardır, birincisi standart if ... elif ... zinciridir. Diğeri ise, bir sözlük eşleme seçiminin (örneğin işlevlerin bir altkümesi) Tam olarak ne yaptığınıza bağlı olarak hangisi daha iyi bir fikirdir.

elif zincir

selection = get_input() 
if selection == 'option1': 
     handle_option1() 
elif selection == 'option2': 
     handle_option2() 
elif selection == 'option3': 
     some = code + that 
     [does(something) for something in range(0, 3)] 
else: 
     I_dont_understand_you() 

sözlüğü:

# Somewhere in your program setup... 
def handle_option3(): 
    some = code + that 
    [does(something) for something in range(0, 3)] 

seldict = { 
    'option1': handle_option1, 
    'option2': handle_option2, 
    'option3': handle_option3 
} 

# later on 
selection = get_input() 
callable = seldict.get(selection) 
if callable is None: 
     I_dont_understand_you() 
else: 
     callable() 
+0

Sözlük eşlemesinin nasıl kullanıldığına dair basit bir örnek verebilir misiniz? Space_Cowboy'nun örneği oldukça açık değil. –

+1

@sergio: "opener" ve "closeer" fonksiyonlarınız olduğunu varsayalım, pencereyi açıp kapatalım deyin. Sonra bunlardan birini bir dizgeye dayalı olarak çağırmak için, 'switcher = {" open ": açıcı," close ": daha yakın bir}' 'dict''de gerçek fonksiyonlara sahip olursunuz. Daha sonra 'switcher [choice]()' yapabilirsiniz. – katrielalex

8

işlevlerine girişini eşlemek için bir sözlük kullanın.

switchdict = { "inputA":AHandler, "inputB":BHandler} 

İşleyicilerin herhangi bir çağrılabilir olabileceği yerler. Sonra böyle kullanmak:

switchdict[input]() 
+0

+1, Güzel ve zarif :) –

İlgili konular