2010-10-06 54 views
12

Trong python, tôi đã viết này:Tại sao điều này gây ra lỗi cú pháp?

bvar=mht.get_value() 
temp=self.treemodel.insert(iter,0,(mht,False,*bvar)) 

Tôi đang cố gắng để mở rộng bvar để gọi chức năng như các đối số. Nhưng sau đó quay lại,

File "./unobsoluttreemodel.py", line 65 
    temp=self.treemodel.insert(iter,0,(mht,False,*bvar)) 
               ^
SyntaxError: invalid syntax 

Điều gì vừa xảy ra? Nó phải đúng không?

Trả lời

21

Nếu bạn muốn vượt qua các đối số cuối cùng như một tuple của (mnt, False, bvar[0], bvar[1], ...) bạn có thể sử dụng

temp = self.treemodel.insert(iter, 0, (mht,False)+tuple(bvar)) 

Cú pháp gọi mở rộng *b chỉ có thể được sử dụng trong calling functions, function arguments, và tuple unpacking trên Python 3. x.

>>> def f(a, b, *c): print(a, b, c) 
... 
>>> x, *y = range(6) 
>>> f(*y) 
1 2 (3, 4, 5) 

Tuple literal không thuộc một trong những trường hợp này, do đó, nó gây ra lỗi cú pháp.

>>> (1, *y) 
    File "<stdin>", line 1 
SyntaxError: can use starred expression only as assignment target 
+1

Phải, toán tử phân giải '*' không được phép tạo tuple. – AndiDog

0

Dường như bạn có thêm dấu ngoặc đơn trong đó. Hãy thử:

temp=self.treemodel.insert(iter,0,mht,False,*bvar) 

Cú pháp phụ của bạn đang cố gắng tạo một bộ dữ liệu sử dụng cú pháp *, đây là lỗi cú pháp.

2

Không phải không đúng. Tham số mở rộng chỉ hoạt động trong các đối số hàm, không chỉ trong các bộ dữ liệu.

>>> def foo(a, b, c): 
...  print a, b, c 
... 
>>> data = (1, 2, 3) 
>>> foo(*data) 
1 2 3 

>>> foo((*data,)) 
    File "<stdin>", line 1 
    foo((*data,)) 
     ^
SyntaxError: invalid syntax 
28

Cập nhật: Hành vi này đã được cố định bằng Python 3.5.0, xem PEP-0448:

Tháo bao bì được đề xuất để được phép vào bên trong tuple, danh sách, thiết lập, và hiển thị từ điển:

*range(4), 4 
# (0, 1, 2, 3, 4) 

[*range(4), 4] 
# [0, 1, 2, 3, 4] 

{*range(4), 4} 
# {0, 1, 2, 3, 4} 

{'x': 1, **{'y': 2}} 
# {'x': 1, 'y': 2} 
Các vấn đề liên quan