2012-05-02 38 views
6

Tôi có một mô-đun trang trí một số chức năng chính với trang trí tùy chỉnh.Có cách nào để bước vào các chức năng trang trí, bỏ qua mã trang trí

Gỡ lỗi các chức năng này với pdb thường là một chút đau đớn, bởi vì mỗi khi tôi bước vào một chức năng trang trí, trước tiên tôi phải bước qua mã trang trí. Tôi có thể tất nhiên chỉ cần thiết lập trình gỡ lỗi để phá vỡ trong hàm tôi quan tâm, nhưng như các chức năng chính chúng được gọi nhiều lần từ nhiều nơi vì vậy tôi thường thích bắt đầu gỡ lỗi bên ngoài chức năng này. Các tính năng chính của chúng tôi là:.

tôi đã cố gắng để minh họa nó bằng mã, nhưng tôi không biết nếu điều đó giúp:

def i_dont_care_about_this(fn): 
    @functiontools.wraps(fn) 
    def wrapper(*args, **kwargs): 
     return fn(*args, **kwargs) 
    return wrapper 

@i_dont_care_about_this 
def i_only_care_about_this(): 
    # no use to set pdb here 

def i_am_here(): 
    import pdb; pdb.set_trace() 
    i_only_care_about_this() 

Vì vậy, có cách nào cho tôi để bước vào i_only_care_about_this từ i_am_here mà không đi qua i_dont_care_about_this?

Về cơ bản tôi muốn bỏ qua tất cả các mã trang trí khi sử dụng s Sang (s) tep vào một chức năng trang trí nhất định.

+2

Làm thế nào để PDB biết rằng một hàm được trang trí và tại mà điểm chức năng ban đầu là entere d? Bạn sẽ phải thích ứng với cả hai trang trí của bạn và PDB để làm một cái gì đó như thế này có thể. –

+0

Tôi nghĩ rằng có thể có một cách như là kiến ​​thức của tôi về cách xử lý Python trang trí nội bộ là hơi hạn chế. –

Trả lời

4

Tôi không nghĩ bạn có thể làm điều đó. Nó sẽ thay đổi ý nghĩa của bước để trở thành một thứ rất khác biệt.

Tuy nhiên, có một cách để đạt được điều gì đó tương tự như những gì bạn muốn. Đặt điểm ngắt trong chức năng được trang trí của bạn và một điểm ngay trước khi chức năng trang trí được gọi. Bây giờ, vô hiệu hóa điểm ngắt bên trong hàm.

Bây giờ, khi bạn chạy mã, nó sẽ chỉ phá vỡ khi bạn đạt được lời gọi cụ thể mà bạn quan tâm. Khi sự cố đó xảy ra, hãy bật lại điểm ngắt trong hàm và tiếp tục thực hiện. Điều này sẽ thực hiện tất cả các mã trang trí và phá vỡ trên dòng đầu tiên của chức năng trang trí.

+0

Hm, tôi nghĩ OP đã biết điều đó, ít nhất anh ta mô tả nó trong câu hỏi như một khả năng anh/cô ấy đã cân nhắc. –

+0

Tôi thực sự không và nó có thể giúp trong một số trường hợp –

6

Nếu trang trí là hoàn toàn cho khai thác gỗ hoặc hành vi không có chức năng khác, sau đó làm cho nó một không-op để gỡ lỗi - chèn mã này ngay sau khi định nghĩa của i_dont_care_about_this:

DEBUG = False 
# uncomment this line when pdb'ing 
# DEBUG = True 
if DEBUG: 
    i_dont_care_about_this = lambda fn : fn 

Nhưng nếu nó chứa thực tế mã hoạt động, sau đó bạn sẽ phải làm công việc bằng cách sử dụng các phương thức pdb, chẳng hạn như một cuộc gọi có điều kiện đến pdb.set_trace bên trong mã bên trong trang trí:

BREAK_FLAG = False 
... 
# (inside your function you want to debug) 
if BREAK_FLAG: 
    import pdb; pdb.set_trace() 
... 
# at your critical calling point 
BREAK_FLAG = True 
Các vấn đề liên quan