2013-08-26 28 views
5

nghiên cứu bản thân mình vào một góc một lần nữa ...func (* args, ** kwargs, x) ném không hợp lệ cú pháp

def superfunction(*args, **kwargs, k): 
           ^
SyntaxError: invalid syntax 

Whats sự cai trị Im phá vỡ ở đây? Có vẻ như bạn không được phép kết hợp các biến 'thông thường' với các biến *, nhưng tôi không thể tìm thấy bất kỳ ai để xác nhận hoặc từ chối điều này. Tôi đọc ở đâu đó (và bây giờ tôi không thể tìm thấy) rằng một số loại đối số phải đến trước, tôi tin rằng các đối số từ khóa, có thể hoặc không phải là một phần của vấn đề của tôi.

+0

Chi tiết về chính xác lý do tại sao sự cố này sai khác một chút giữa Python 2.x và 3.x; xem phần hướng dẫn [Các đối số từ khóa] (http://docs.python.org/2/tutorial/controlflow.html#keyword-arguments) và phần tham chiếu [Định nghĩa chức năng] (http://docs.python.org/ 2/reference/compound_stmts.html # function) cho phiên bản thích hợp của bạn có các chi tiết. Nhưng một thời gian ngắn, không có gì có thể đến sau tham số '**'. – abarnert

+0

Tôi cũng có một [bài đăng blog] (http://stupidpythonideas.blogspot.com/2013/08/arguments-and-parameters.html) giải thích đầy đủ chi tiết; Tôi không nghĩ rằng đó là ở tất cả những người mới thân thiện ... nhưng tôi hy vọng nó ít nhất là dễ dàng hơn một chút so với đọc tài liệu tham khảo. (Tuy nhiên, cụ thể là Python 3) – abarnert

Trả lời

13

Hãy thử điều này:

def superfunction(k, *args, **kwargs): 

Tham số từ khóa **kwargs biến phải là phần cuối cùng trong phần khai báo hàm. Thứ hai đến cuối cùng, thông số vị trí biến số *args. (Chỉ trong Python 3.x, bạn cũng có thể có các tham số chỉ từ khóa giữa *args**kwargs.) Và ở những vị trí đầu tiên, các tham số vị trí - đó là cách chính xác để khai báo các tham số hàm. Hãy xem post này để biết thêm chi tiết.

Để tham khảo đầy đủ, hãy xem phần Định nghĩa chức năng trong Python 3.x hoặc Python 2.x.

+1

vì vậy các vars chưa được đặt tên của nó, có tên là vars, *, ** – jason

+0

Thứ tự duy nhất tôi có thể làm cho nó hoạt động là def superfunction (k, n = 2, * args, ** kwargs): Cảm ơn bạn đã đưa tôi đi đúng hướng. – jason

+0

followup: def superfunction (k, n = 2, * args, * args2, ** kwargs): Có nhiều đối số kiểu * cũng ném lỗi cú pháp. Tôi đoán bạn chỉ được phép một? – jason

4

Cú pháp nên như thế này:

def superfunction(k, *args, **kwargs): 

Trước tiên, bạn cung cấp cho tất cả các đối số vị trí, sau đó lập luận phi từ khóa, và sau đó đối số từ khóa.

+0

Bên cạnh việc nhận được đối số và tham số sai ... đối số không từ khóa và lập luận vị trí là cùng một điều, do đó, điều này là khó hiểu và sai. – abarnert

+0

Thứ tự đúng là: tham số vị trí hoặc từ khóa, sau đó tùy chọn '* args' (hoặc' * ', chỉ trong Python 3.x), sau đó (chỉ trong Python 3.x) params chỉ từ khóa, sau đó' * * kwargs'. – abarnert

+0

@abarnert Ah! Là nó? Tôi đọc nó vài tháng trước, vì vậy tôi dường như quên thuật ngữ kỹ thuật, và do đó một sự pha trộn. Cảm ơn bạn đã chỉ ra điều đó. –

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