2011-12-06 32 views
13

Do các quy tắc phạm vi của Python, tất cả các biến khi được khởi tạo trong phạm vi có sẵn sau đó. Vì điều kiện không đưa ra phạm vi mới, nên việc xây dựng bằng các ngôn ngữ khác (như khởi tạo biến trước điều kiện đó) không nhất thiết là cần thiết. Ví dụ, chúng ta có thể có:Cách khởi tạo biến có điều kiện là gì?

def foo(optionalvar = None): 
    # some processing, resulting in... 
    message = get_message() 
    if optionalvar is not None: 
     # some other processing, resulting in... 
     message = get_other_message() 
    # ... rest of function that uses message 

hay, chúng ta có thể có thay vì:

def foo(optionalvar = None): 
    if optionalvar is None: 
     # processing, resulting in... 
     message = get_message() 
    else: 
     # other processing, resulting in... 
     message = get_other_message() 
    # ... rest of function that uses message 

Tất nhiên, get_messageget_other_message chức năng có thể có nhiều dòng mã và về cơ bản không thích hợp (bạn có thể giả định trạng thái của chương trình sau mỗi đường dẫn giống nhau); mục tiêu ở đây là làm cho message sẵn sàng để sử dụng ngoài phần này của hàm.

Tôi đã nhìn thấy các cấu trúc sau sử dụng nhiều lần trong các câu hỏi khác, chẳng hạn như:

nào xây dựng sẽ được chấp nhận hơn?

+1

Điều đó có hoàn toàn phụ thuộc vào việc bạn muốn 'get_message' chạy điều kiện hoặc vô điều kiện không? – delnan

+0

Ý tưởng ở đây không phải là chức năng để gọi, mà là việc xây dựng 'thông điệp': bản thân hàm không liên quan. –

+1

Cho dù đó là một chức năng hay không, một sự khác biệt ngữ nghĩa là một trong những chạy một nửa của mã vô điều kiện. Nếu nó tạo ra sự khác biệt, có rất ít điểm trong phong cách tranh luận. – delnan

Trả lời

12

Python cũng có một rất hữu ích nếu mô hình cú pháp mà bạn có thể sử dụng ở đây

message = get_other_message() if optional_var else get_message() 

Hoặc nếu bạn muốn so sánh chặt chẽ với Không

message = get_other_message() if optional_var is not None else get_message() 

Không giống với ví dụ 1) bạn được đăng doesn này Không gọi get_message() không cần thiết.

+1

Đây là ** THE ** Pythonic cách để thực hiện các bài tập có điều kiện (kể từ v2.5), ít nhất là như xa như ngôn ngữ chính nó là có liên quan. Xem [PEP 308] (http://docs.python.org/release/2.5/whatsnew/pep-308.html) để biết thêm thông tin. – voithos

+0

Nó cũng giống như PEP 308 cho thấy định dạng thứ hai là cách chấp nhận trước đó để làm điều này. Tốt để biết! –

1

Tôi cho rằng nó không phải là một quy tắc rõ ràng về điều này, và thay vào đó chỉ cần giữ ý tưởng rằng các chức năng nhỏ hơn sẽ tốt hơn (một phần vì bạn có thể lưu ý khi tên mới được giới thiệu). Tôi giả sử rằng nếu các xét nghiệm có điều kiện của bạn phức tạp hơn nhiều so với if/else, bạn có thể gặp nguy cơ tất cả chúng không thành công và sau đó bạn sử dụng tên không xác định, dẫn đến lỗi thời gian chạy, trừ khi bạn rất cẩn thận. Đó có thể là một đối số cho phong cách đầu tiên, khi có thể.

0

Câu trả lời phụ thuộc vào nếu có các tác dụng phụ của get_message() cần thiết.

Trong hầu hết các trường hợp, rõ ràng trường hợp thứ hai thắng, vì mã tạo ra kết quả không mong muốn sẽ không được thực thi. Nhưng nếu bạn cần các tác dụng phụ, bạn nên chọn phiên bản đầu tiên.

0

Có thể tốt hơn (đọc: an toàn hơn) để khởi tạo biến của bạn bên ngoài các điều kiện. Nếu bạn phải xác định các điều kiện khác hoặc thậm chí loại bỏ một số, người dùng của message sau này có thể nhận được một ngoại lệ biến chưa được khởi tạo.

4

Cách tiếp cận thứ hai chung là tốt hơn và chung chung hơn vì nó không liên quan đến việc gọi get_message vô điều kiện.Mà có thể ok nếu chức năng mà không tài nguyên ưu đãi nhưng hãy xem xét một chức năng tìm kiếm

def search(engine): 
    results = get_from_google() 
    if engine == 'bing': 
     results = get_from_bing() 

rõ ràng điều này là không tốt, tôi không thể nghĩ ra kịch bản xấu như vậy đối với trường hợp thứ hai, vì vậy cơ bản là một cách tiếp cận mà đi qua tất cả tùy chọn và cuối cùng là mặc định là tốt nhất ví dụ

def search(engine): 
    if engine == 'bing': 
     results = get_from_bing() 
    else: 
     results = get_from_google() 
Các vấn đề liên quan