2010-06-28 21 views
5

Hãy tưởng tượng này:Pythonic cách để chức năng/phương pháp với rất nhiều lý lẽ

def method(self, alpha, beta, gamma, delta, epsilon, zeta, eta, theta, iota, kappa): 
    pass 

Dòng cầu vượt số 79 ký tự, vì vậy, cách pythonic để Multiline đó là những gì?

+3

Xem xét nhóm các thông số vào các lớp giữ dữ liệu cố kết – manifest

+0

Đối với tất cả, tôi biết về * args, nhưng tôi không thể nhóm các đối số theo cách này, vì tôi đang sử dụng một tập con của Python không cho phép cú pháp này . – mkotechno

Trả lời

4

tôi thụt dòng tiếp theo 2 mức:

def method(self, alpha, beta, gamma, delta, epsilon, zeta, eta, 
     theta, iota, kappa): 
    pass 
+1

+1 và được chấp nhận vì chỉ trả lời câu hỏi giả sử tôi không ngốc và giải pháp tương thích với dấu cách và tab thụt đầu dòng. – mkotechno

19

Bạn có thể bao gồm ngắt dòng trong ngoặc đơn (hoặc khung), ví dụ

def method(self, alpha, beta, gamma, delta, epsilon, zeta, 
       eta, theta, iota, kappa): 
    pass 

(số lượng khoảng trắng để bao gồm là, tất nhiên, tùy thuộc vào bạn)

Nhưng trong trường hợp này, bạn cũng có thể xem xét

def method(self, *args): 
    pass 

và/hoặc

def method(self, **kwargs): 
    pass 

tùy thuộc vào cách bạn sử dụng đối số (và cách bạn muốn hàm được gọi).

+1

+1 cho '* args' và' ** kwargs' –

+0

+1 khác cho '* args' và' ** kwargs' – gomad

+0

+1 nhiều dòng với dấu ngoặc đơn. Nó đã cho tôi một lúc để tìm ra bạn có thể làm điều này và rất nhiều người mới bắt đầu là không biết sự tiện lợi của nó. Nói lời tạm biệt với xấu xí \! – manifest

1

Nếu bạn có một chức năng mà phải mất quá nhiều biến số như các đối số, điều cuối cùng bạn phải lo lắng về là thụt đầu dòng

+0

Không hẳn là câu trả lời đúng không? –

+0

Tôi muốn bỏ phiếu này một cách tệ hại, nhưng vâng ... Nên có một bình luận. – Shog9

1

Tôi chỉ chia để khung mở một lần 79 là hit, như thế này:

def method(self, alpha, beta, gamma, delta, epsilon, zeta, eta, theta, iota, 
      kappa): 

Và khi tên quá dài để được đặt sau dấu ngoặc mở cửa, tôi làm điều đó như thế này:

x.long_function_is_long(
    long_argument_is_loooooooooooooooooooooooooooooooooooooooong, 
    longer_argument_is_looooooooooooooooooooooooooooooooooooooooonger 
) 
-2

tôi thường làm điều này, tôi không biết nếu đó là tốt nhất, nhưng nó w orks. Kể từ khi tôi phải tách dòng tôi làm cho họ đều dài hơn (nếu tôi có thể):

def method(self, alpha, beta, gamma, delta, epsilon, \ 
       zeta, eta, theta, iota, kappa): 
    pass 

Ngoài ra, có số lượng như vậy các thông số tôi muốn giới thiệu giống như David, sử dụng *args

+1

\ ký tự không cần thiết. Trong Python, việc nhóm với dấu ngoặc đơn cho phép mã mở rộng nhiều dòng - điều này được chỉ ra trong PEP 8 http://www.python.org/dev/peps/pep-0008/. –

+0

Không biết về điều đó. Cảm ơn :) –

9

Tôi nghĩ rằng ' Cách trả lời của Pythonic này là nhìn sâu hơn cú pháp. Việc chuyển nhiều đối số đó vào một phương thức cho thấy một vấn đề có thể xảy ra với mô hình đối tượng của bạn.

  1. Trước hết, bạn có thực sự cần truyền nhiều đối số đó cho phương pháp này không? Có lẽ đây là một dấu hiệu cho thấy công việc có thể được thực hiện tốt hơn ở nơi khác (bởi một đối tượng đã có quyền truy cập vào các biến)?

  2. Nếu đây thực sự là nơi tốt nhất cho phương pháp, thì một số đối số đó có thể được cung cấp dưới dạng biến mẫu của chính đối tượng này (thông qua self)?

  3. Nếu không, bạn có thể xác định lại trách nhiệm của đối tượng cha mẹ để bao gồm chúng không?

  4. Nếu không, bạn có thể gói gọn bất kỳ đối số riêng lẻ nào trong đối tượng kết hợp chính thức hóa mối quan hệ giữa chúng không? Nếu bất kỳ đối số nào có điểm chung, thì điều này có thể xảy ra.

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