2015-02-24 13 views
6

Tôi đang cố gắng viết một chức năng ngay bây giờ và mục đích của nó là đi qua một đối tượng __dict__ và thêm một mục vào từ điển nếu mục đó không phải là một hàm. Đây là mã của tôi:Thêm các mục vào danh sách nếu nó không phải là chức năng

def dict_into_list(self): 
    result = {} 
    for each_key,each_item in self.__dict__.items(): 
     if inspect.isfunction(each_key): 
      continue 
     else: 
      result[each_key] = each_item 
    return result 

Nếu tôi không nhầm, inspect.isfunction là nghĩa vụ phải nhận ra lambdas như các chức năng là tốt, có đúng không? Tuy nhiên, nếu tôi viết

c = some_object(3) 
c.whatever = lambda x : x*3 

thì chức năng của tôi vẫn bao gồm lambda. Ai đó có thể giải thích tại sao điều này?

Ví dụ, nếu tôi có một lớp học như thế này:

class WhateverObject: 
    def __init__(self,value): 
     self._value = value 
    def blahblah(self): 
     print('hello') 
a = WhateverObject(5) 

Vì vậy, nếu tôi nói print(a.__dict__), cần trả lại {_value:5}

+0

Bạn có thể hiển thị ví dụ độc lập thể hiện sự cố không? – BrenBarn

+0

@Tyler chức năng có nghĩa là, những gì bạn mong đợi? Mà không phải là chức năng trong trường hợp của bạn? – Nilesh

Trả lời

4

Bạn đang thực sự kiểm tra nếu each_key là một chức năng, trong đó có khả năng nhất không phải là. Bạn thực sự phải kiểm tra giá trị, như thế này

if inspect.isfunction(each_item): 

Bạn có thể xác nhận điều này, bằng cách bao gồm một print, như thế này

def dict_into_list(self): 
    result = {} 
    for each_key, each_item in self.__dict__.items(): 
     print(type(each_key), type(each_item)) 
     if inspect.isfunction(each_item) == False: 
      result[each_key] = each_item 
    return result 

Ngoài ra, bạn có thể viết mã của bạn với sự hiểu biết từ điển, như

này
def dict_into_list(self): 
    return {key: value for key, value in self.__dict__.items() 
      if not inspect.isfunction(value)} 
+0

Có, chức năng của bạn là chính xác. Tuy nhiên, làm thế nào bạn biết rằng mỗi phím có nhiều khả năng không phải là một chức năng? – Tyler

+0

@Tyler '__dict__' sẽ có các khóa chuỗi và các giá trị là các đối tượng tương ứng. – thefourtheye

0

Tôi có thể nghĩ một cách dễ dàng để tìm các biến của một đối tượng thông qua dir và các phương thức có thể gọi của python thay vì mô-đun inspect.

{var:self.var for var in dir(self) if not callable(getattr(self, var))} 

Xin lưu ý rằng điều này thực sự giả định rằng bạn đã không overrided __getattr__ phương pháp của lớp để làm điều gì đó khác hơn là nhận được các thuộc tính.

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