2013-05-15 38 views
5

Tôi có các biến sau mà người dùng có thể tùy chọn gửi qua biểu mẫu (không bắt buộc, nhưng có thể thực hiện việc này để lọc tìm kiếm).Python - Chỉ chuyển đối số nếu biến tồn tại

color = request.GET.get ('color') 
size = request.GET.get ('size') 

Bây giờ tôi muốn chuyển các biến này cho một hàm, nhưng chỉ khi chúng tồn tại. Nếu chúng không tồn tại, tôi chỉ muốn chạy hàm mà không có đối số.

chức năng không có đối số là:

apicall = search() 

với màu sắc chỉ đó là

apicall = search (color) 

và với màu sắc và kích thước đó là

apicall = search (color, size) 

Nếu đối số được định nghĩa tôi muốn vượt qua nó vào chức năng, nhưng nếu nó không phải là tôi không muốn vượt qua nó.

Cách hiệu quả nhất để làm điều đó là gì? Có python có được xây dựng trong phương pháp này?

Trả lời

6

Giả sử đó là cuộc gọi tiêu chuẩn get (như trên từ điển), điều này phải dễ dàng. Xác định chức năng của bạn với None cho các giá trị mặc định cho thông số của bạn và sau đó vượt qua colorsize mà không cần kiểm tra chúng!

def apicall(color=None, size=None): 
    pass # Do stuff 

color = request.GET.get('color') 
size = request.GET.get('size') 
apicall(color, size) 

Bằng cách này, bạn chỉ kiểm tra None tranh cãi ở một nơi (bên trong gọi hàm, nơi bạn phải kiểm tra anyway nếu chức năng có thể được gọi theo nhiều cách). Mọi thứ vẫn tốt đẹp và sạch sẽ. Tất nhiên điều này giả định (như tôi đã nói ở trên) rằng cuộc gọi get của bạn giống như một phương pháp từ điển bình thường của Python từ get, trả về None nếu không tìm thấy giá trị.

Cuối cùng, tôi nhận thấy rằng tên hàm của bạn là apicall: có khả năng bạn không thực sự có quyền truy cập vào mã chức năng. Trong trường hợp này, vì bạn có thể không biết gì về các giá trị mặc định của chữ ký hàm và None có thể sai, tôi có lẽ chỉ cần viết một trình bao bọc đơn giản để thực hiện kiểm tra đối số cho bạn. Sau đó, bạn có thể gọi trình bao bọc như trên!

def wrapped_apicall(color=None, size=None): 
    if color is None and size is None: 
     return apicall() 
    # At least one argument is not None, so... 
    if size is None: 
     # color is not None 
     return apicall(color) 
    if color is None: 
     # size is not None 
     return apicall(size) 
    # Neither argument is None 
    return apicall(color, size) 

LƯU Ý: phiên bản thứ hai này không nên cần thiết trừ khi bạn không thể nhìn thấy đoạn code mà bạn đang gọi điện thoại và không có bất kỳ tài liệu về nó! Sử dụng None làm đối số mặc định là rất phổ biến, vì vậy rất có thể là bạn chỉ có thể sử dụng cách đầu tiên. Tôi sẽ chỉ sử dụng phương thức wrapper nếu bạn không thể sửa đổi hàm bạn đang gọi và bạn không biết đối số mặc định của nó là gì (hoặc đối số mặc định của nó là hằng số mô-đun hoặc thứ gì đó, nhưng điều đó khá hiếm).

+0

Có, nhưng nếu tôi là một trong những biến không được định nghĩa thì 'apicall (màu sắc, kích thước) ' sẽ ném một lỗi, phải không? – user1328021

+0

Ok cảm ơn ... những gì bạn viết là làm thế nào tôi giả sử nó được thực hiện, nhưng tôi đã nghĩ rằng phải có một cách hiệu quả hơn ... – user1328021

+0

@ user1328021 Giả sử cả hai dòng này thực hiện: 'color = request.GET .get ('color') 'và ' size = request.GET.get ('size') ', sau đó cả hai' color' và 'size' được đảm bảo ** được định nghĩa **, mặc dù chúng có thể là' None '. Bạn nghĩ điều gì không hiệu quả về điều này? –

0

Khi bạn xác định phương pháp, nếu bạn đặt đối số mặc định, bạn có thể chỉ định đối số hoặc không.

def search(color=None, size=None): 
    pass 

Sau đó, khi bạn gọi, bạn có thể chỉ định đối số từ khóa khi bạn chọn.Cả hai sẽ có giá trị:

apicall = search(color=color) 
apicall = search(size=size) 
0

meybe bạn có thể sử dụng một cái gì đó như thế này:

try: 
    apicall = search (color, size) 
else: 
    apicall = search(color) 
+0

không hoạt động ... kích thước là Không, nhưng nó vẫn tồn tại ... –

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