2012-11-29 27 views
9

Tôi cần phát hiện xem hàm có phải là định nghĩa trống hay không. Nó có thể được như:Phát hiện các định nghĩa hàm trống trong python

def foo(): 
    pass 

hay như:

def foo(i, *arg, **kwargs): 
    pass 

hay như:

foo = lambda x: None 

cách thanh lịch nhất để phát hiện chúng bằng cách sử dụng 'kiểm tra' module là gì? Có cách nào tốt hơn điều này không:

def isEmptyFunction(func): 
    e = lambda: None 
    return func.__code__.co_code == e.__code__.co_code 
+0

Bạn có thể sử dụng generate_tokens và kiểm tra xem thẻ bắt đầu với "def" hoặc "lambda". Sau đó, tìm ":" và "vượt qua" hoặc "Không" ngay sau đó. Không sạch sẽ, nhưng tôi đoán điều này sẽ làm việc. – spicavigo

+0

Tuy nhiên, một cách khác là sử dụng mô-đun ast và phân tích cú pháp chuỗi chức năng. Tôi nghĩ rằng bạn có thể làm việc ra các chi tiết. – spicavigo

+3

Cách bạn đang làm nó có vẻ ổn. – BrenBarn

Trả lời

1

Cách bạn đang sử dụng tác phẩm. Một giải pháp có lẽ "thanh lịch" hơn là có một danh sách các hàm, và trong tất cả các hàm rỗng (hoặc tất cả không trống) của bạn, bạn sẽ thêm nó vào danh sách, và sau đó kiểm tra xem hàm có nằm trong danh sách hay không .

-2

Tại sao bạn làm điều đó? Nó trông giống như thiết kế xấu. Tôi cá là bạn sẽ không làm gì nhanh hơn.

python -m timeit -s'def a(): pass' -s'def b(): pass' 'if a.__code__.co_code == b.__code__.co_code: pass' 
1000000 loops, best of 3: 0.293 usec per loop 

python -m timeit -s 'def a(): pass' -s 'def b(): pass' 'a()' 
10000000 loops, best of 3: 0.0941 usec per loop 

Dường như chậm hơn so với chỉ để thực hiện cuộc gọi, vì có nhiều vòng hơn 10 lần trong thời gian sau. Toán tử bằng thực sự chắc chắn gọi a. .co_code. eq. Vì vậy, bạn chỉ làm mọi thứ chậm hơn.

4

Phương pháp bạn đề xuất không hoạt động vì các hàm trống có docstrings có một bytecode hơi khác nhau.

Giá trị func.__code__.co_code cho hàm trống không có chuỗi là 'd\x00\x00S', trong khi giá trị của hàm cho một hàm có chuỗi là 'd\x01\x00S'.

Đối với mục đích của tôi, nó hoạt động chỉ để thêm các trường hợp khác để kiểm tra:

def isEmptyFunction(func): 
    def empty_func(): 
     pass 

    def empty_func_with_doc(): 
     """Empty function with docstring.""" 
     pass 

    return func.__code__.co_code == empty_func.__code__.co_code or \ 
     func.__code__.co_code == empty_func_with_doc.__code__.co_code 
Các vấn đề liên quan