2016-09-21 12 views
5

Tôi chỉ tò mò về **kwargs. Tôi chỉ mới bắt đầu học nó, Vì vậy, khi đi qua tất cả các câu hỏi về stackoverflow và video hướng dẫn tôi nhận thấy chúng ta có thể làm như thế nàyCó cách nào để in ** kwargs bằng Python

def print_dict(**kwargs): 
    print(kwargs) 
print_dict(x=1,y=2,z=3) 

Mà cho đầu ra như: {'y': 2, 'x': 1, 'z': 3} Vì vậy, con số tôi tại sao không làm điều ngược lại và in những thứ tương tự x=1,y=2,z=3

Vì vậy, tôi cố gắng này:

mydict = {'x':1,'y':2,'z':3} 
print(**mydict) 

Nhưng tôi đã nhận ra lỗi như: TypeError: 'z' is an invalid keyword argument for this function (đôi khi nó cho thấy 'y' là một từ khóa không hợp lệ).

Tôi cũng đã cố gắng như gán nó vào biến và sau đó in nó nhưng một lần nữa tôi đã nhận một lỗi (SyntaxError: invalid syntax):

mydict = {'x':1,'y':2,'z':3} 
var = **mydict 
print(var) 

Xem này đang làm việc:

def print_dict(**this): 
    print(this) 
mydict = {'x':1,'y':2,'z':3} 
print_dict(**mydict) 

Nhưng thay vì print(this) nếu tôi làm print(**this) nó sẽ gây ra lỗi.

Như chúng ta có thể in *arg như tôi thử mã này:

def num(*tuple_num): 
    print(tuple_num) 
    print(*tuple_num) 
num(1,2,3,4) 

Nó chạy một cách hoàn hảo và cho sản lượng như:

(1, 2, 3, 4) 
1 2 3 4 

Vì vậy, tôi muốn biết là có bất kỳ giải pháp khả thi/cách để in **kwargs?

Trả lời

9

Cú pháp callable(**dictionary)áp dụng điển như nếu bạn sử dụng đối số từ khóa riêng biệt.

Vì vậy, ví dụ bạn:

mydict = {'x':1,'y':2,'z':3} 
print(**mydict) 

là nội dịch sang:

print(x=1, y=2, z=3) 

nơi đặt hàng chính xác phụ thuộc vào hạt băm ngẫu nhiên hiện tại. Vì print() không hỗ trợ các đối số từ khóa đó, cuộc gọi không thành công.

Các print() gọi khác thành công, bởi vì bạn thông qua trong các giá trị riêng biệt vị trí đối số:

tuple_num = (1, 2, 3, 4) 
print(*tuple_num) 

được hiệu quả tương tự như:

print(1, 2, 3, 4) 

print() chức năng hỗ trợ lập luận riêng bằng cách viết chúng từng cái một với giá trị sep ở giữa (mặc định là khoảng trắng).

**dictionary không phải là cú pháp hợp lệ bên ngoài cuộc gọi. Vì callable(**dictionary) là một phần của cú pháp cuộc gọi và không phải là một đối tượng, có không có gì để in.

Tại hầu hết, bạn có thể định dạng điển để trông giống như cuộc gọi:

print(', '.join(['{}={!r}'.format(k, v) for k, v in mydict.items()])) 
+0

Soi câu trả lời, đó là. – Nevertheless

4

Bạn phải xây dựng định dạng của riêng bạn cho các từ điển (không có gì khác là **kwargs):

print(','.join('{0}={1!r}'.format(k,v) for k,v in this.items())) 
Các vấn đề liên quan