2013-03-04 44 views
19

Tôi đã một lớp định nghĩa như sauLàm thế nào để vượt qua đối số argparse để hoạt động như kwargs?

class M(object): 
    def __init__(self, **kwargs): 
     ...do_something 

và tôi có kết quả của argparse.parse_args(), ví dụ:

> args = parse_args() 
> print args 
Namespace(value=5, message='test', message_type='email', extra="blah", param="whatever") 

Tôi muốn truyền lại các giá trị của không gian tên này (trừ message_type) để tạo một thể hiện của lớp M. Tôi đã cố gắng

M(args) 

nhưng có một lỗi

TypeError: __init__() takes exactly 1 argument (2 given) 

mà tôi không hiểu. Làm thế nào tôi có thể

  1. loại bỏ các giá trị message_type từ danh sách trong args
  2. vượt qua trên các giá trị như thể tôi sẽ gõ M(value=5, message='test', extra="blah", param="whatever") trực tiếp.

Trả lời

31

Bạn cần phải vượt qua trong kết quả của vars(args) thay vì:

M(**vars(args)) 

Các vars() function lợi nhuận không gian tên của instance Namespace (__dict__ thuộc tính của nó) như một cuốn từ điển.

Bên trong M.__init__(), chỉ cần bỏ qua phím message_type.

+1

Thats chính xác những gì tôi cần. Cảm ơn. Ngoại trừ việc loại bỏ khóa nhất định. Tôi cần nó để được loại bỏ, tôi không thể bỏ qua nó vì những lý do nằm ngoài phạm vi của câu hỏi này. – Alex

+2

Tôi đề nghị làm 'arg_dict = dict ((k, v) cho k, v trong vars (args) .items() nếu k! =" Message_type ")' để tránh hành vi không xác định có thể với 'vars'. – Alex

+0

@ Alex: hành vi không xác định với 'vars' là gì? Bạn có thể lọc ra khóa 'message_type' theo cách đó, chắc chắn, nhưng làm điều đó vì lợi ích riêng của nó, không phải vì' vars() 'có thể có hành vi không xác định (mà nó không). –

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