2012-12-22 31 views
12

Tôi có một lớp Python với một phương pháp mà nên chấp nhận lập luận và tranh cãi từ khóa theo cách nàychức năng python * args và kwargs ** với các đối số từ khóa cụ thể khác

class plot: 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

    def set_axis(self, *args, xlabel="x", ylabel="y", **kwargs): 
     for arg in args: 
      <do something> 
     for key in kwargs: 
      <do somethng else> 

khi gọi:

plt = plot(x, y) 
plt.set_axis("test1", "test2", xlabel="new_x", my_kwarg="test3") 

Tôi gặp lỗi: TypeError: set_axis() got multiple values for keyword argument 'xlabel'

Dù sao thì nếu tôi đặt phương thức của mình như

class plot: 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

    def set_axis(self, xlabel="x", ylabel="y", *args, **kwargs): 
     for arg in args: 
      <do something> 
     for key in kwargs: 
      <do somethng else> 

và gọi:

plt = plot(x, y) 
plt.set_axis(xlabel="new_x", "test1", "test2", my_kwarg="test3") 

tôi nhận được SyntaxError: non-keyword arg after keyword arg, như tôi đã mong đợi. Điều gì là sai với trường hợp đầu tiên? Làm thế nào tôi nên nói với phương pháp của tôi để chấp nhận bất kỳ đối số người dùng và đối số từ khóa, khác với các đối số mặc định? (Hy vọng câu hỏi của tôi là đủ rõ ràng)

+2

Bạn đang sử dụng phiên bản Python nào? Lớp đầu tiên bạn liệt kê không phân tích cú pháp trong Python 2.7.3 vì '* args' được kế thừa bởi tên tham số trong định nghĩa' set_axis'. – phant0m

Trả lời

14

Bạn sẽ sử dụng một mô hình khác nhau:

def set_axis(self, *args, **kwargs): 
    xlabel = kwargs.get('xlabel', 'x') 
    ylabel = kwargs.get('ylabel', 'y') 

này cho phép bạn sử dụng * và ** trong khi vẫn giữ các giá trị dự phòng nếu đối số từ khóa không được định nghĩa.

+0

Bằng cách nào? Nó được xác định trong kwargs và nó đọc giá trị của nó, hoặc nó sử dụng một dự phòng 'x'. –

+4

Đây có phải là cách duy nhất để thực hiện việc này không? Tôi cảm thấy như thể bạn không cần phải quay trở lại để có tất cả từ khóa args trong ** kwargs để trộn * args và đặt tên đối số – eipxen

14

Trong Python 3 công trình này:

Python 3.2.3 (default, Oct 19 2012, 19:53:16) 
>>> def set_axis(self, *args, xlabel="x", ylabel="y", **kwargs): 
...  print(args, xlabel, ylabel, kwargs) 
... 
>>> set_axis(None, "test1", "test2", xlabel="new_x", my_kwarg="test3") 
('test1', 'test2') new_x y {'my_kwarg': 'test3'} 
>>> 
+0

Tôi đang sử dụng Python2.7 – fmonegaglia

+4

Nó không hoạt động trong python 2.7. – Phob

2

Dưới đây là một Tweek nhẹ để Jure C. của câu trả lời:

def set_axis(self, *args, **kwargs): 
    xlabel = kwargs.pop('xlabel', 'x') 
    ylabel = kwargs.pop('ylabel', 'y') 

tôi đã thay đổi get-pop để loại bỏ xlabelylabel từ kwargs nếu có . Tôi đã làm điều này vì phần còn lại của mã trong câu hỏi ban đầu chứa vòng lặp có nghĩa là lặp qua tất cả kwargsngoại trừxlabelylabel.

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