2010-10-20 33 views
7

thể trùng lặp:
Replacements for switch statement in python?Vì Python không có câu lệnh chuyển đổi, tôi nên sử dụng cái gì?

Tôi đang thực hiện một giao diện điều khiển nhỏ dựa trên ứng dụng bằng Python và tôi muốn sử dụng một câu lệnh switch để xử lý các sự lựa chọn của người dùng một lựa chọn menu.

Bạn làm gì để đề xuất tôi sử dụng. Cảm ơn!

+0

Sao chép tất cả những điều sau: http://stackoverflow.com/search?q=%5Bpython%5D+switch. –

+0

Xem thêm câu hỏi [trường hợp chuyển đổi trong python không hoạt động; cần một mẫu khác] (http://stackoverflow.com/questions/3886641/switch-case-in-python-doesnt-work-need-another-pattern/3893242#3893242). – martineau

Trả lời

7

Bảng công văn, hoặc từ điển.

Bạn bản đồ phím aka. các giá trị của lựa chọn trình đơn cho các chức năng thực hiện các lựa chọn đã cho biết:

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']() 

Hãy nhớ xác thực thông tin nhập của bạn! :)

+3

Mã đó rất gợi cảm Tôi muốn tặng nó đồ lót và đặt nó lên Playboy. +1 –

+0

(1) Btw, 'the_input trong menu_choices' là xác thực giá rẻ được đảm bảo đồng bộ với các lựa chọn thực tế. (2) Tất cả các trình xử lý ví dụ trả về 'None', vì vậy đừng làm phiền cảnh sát sau khi chạy ví dụ;) (3) Như thường lệ, sử dụng' raw_input' thay vì 'input' trong Python 2. – delnan

10

Có hai lựa chọn, trước tiên là chuỗi tiêu chuẩn if ... elif .... Khác là một lựa chọn bản đồ từ điển để gọi (các chức năng là một tập hợp con). Phụ thuộc vào chính xác những gì bạn đang làm mà một trong những là ý tưởng tốt hơn.

chuỗi elif

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() 

từ điển:

# 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

Bạn có thể đưa ra một ví dụ đơn giản về cách sử dụng ánh xạ từ điển không? Ví dụ của Space_Cowboy không hoàn toàn rõ ràng. –

+1

@sergio: giả sử bạn có chức năng 'opener' và' closer', nói để mở và đóng cửa sổ. Sau đó, để gọi một trong số chúng dựa trên một chuỗi, làm 'switcher = {" open ": opener," close ": closer}' để bạn có các hàm thực tế trong 'dict'. Sau đó, bạn có thể làm 'switcher [choice]()'. – katrielalex

8

Sử dụng một từ điển để lập bản đồ đầu vào cho các chức năng.

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

Trường hợp trình xử lý có thể được gọi bất kỳ. Sau đó, bạn sử dụng nó như sau:

switchdict[input]() 
+0

+1, Đẹp và thanh lịch :) –

Các vấn đề liên quan