2016-08-02 14 views
42

Nếu tôi có một chức năng như thế này:Thêm giá trị tham số mặc định với kiểu gợi ý bằng Python

def foo(name, opts={}): 
    pass 

Và tôi muốn thêm gợi ý loại các thông số, làm thế nào để làm điều đó? Con đường tôi giả định mang lại cho tôi một lỗi cú pháp:

def foo(name: str, opts={}: dict) -> str: 
    pass 

Sau đây không ném một lỗi cú pháp, nhưng nó không có vẻ như cách trực quan để xử lý trường hợp này:

def foo(name: str, opts: dict={}) -> str: 
    pass 

tôi có thể không tìm thấy bất kỳ thứ gì trong số typing documentation hoặc trên tìm kiếm của Google.

Chỉnh sửa: Tôi không biết các đối số mặc định hoạt động như thế nào trong Python, nhưng vì lợi ích của câu hỏi này, tôi sẽ giữ các ví dụ ở trên. Nói chung, tốt hơn hết là làm như sau:

def foo(name: str, opts: dict=None) -> str: 
    if not opts: 
    opts={} 
    pass 
+1

Chức năng cuối cùng là cách chính xác. Nó cũng giống như ngôn ngữ 'scala'. –

+4

bạn có loại mặc định có thể thay đổi - điều này sẽ dẫn đến sự cố –

+0

xem câu trả lời cập nhật của tôi, @josh –

Trả lời

52

Cách thứ hai của bạn là chính xác.

def foo(opts: dict = {}): 
    pass 

print(foo.__annotations__) 

này kết quả đầu ra

{'opts': <class 'dict'>} 

Đúng đó là nó không được liệt kê trong PEP 484, nhưng kiểu gợi ý là một ứng dụng của chú thích chức năng, mà được diễn tả trong PEP 3107. The syntax section làm cho nó rõ ràng rằng đối số từ khóa công trình với chú thích hàm theo cách này.

Tôi đặc biệt khuyên bạn không nên sử dụng các đối số từ khóa có thể thay đổi. Thêm thông tin here.

+1

Xem http://legacy.python.org/dev/peps/pep-3107/#syntax. Gõ gợi ý chỉ là một ứng dụng của chú thích hàm. – chepner

+0

@chepner true. không biết rằng PEP 3107 có điều gì đó về các đối số từ khóa. –

+1

Ồ, tôi không biết về các đối số mặc định có thể thay đổi trong Python ... đặc biệt là từ Javascript/Ruby, nơi các đối số mặc định hoạt động khác nhau. Không phải rehash những gì đã được nói quảng cáo nauseum xung quanh SO về nó, tôi chỉ vui vì tôi phát hiện ra về điều này trước khi nó bit tôi. Cảm ơn! – josh

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