Làm cách nào để Debug
biết mô-đun nào được nhập từ đó? Trả lời: Nó không thể. Làm thế nào để Debug
biết chạy nhiều lần nếu nó được nhập vào nhiều hơn một mô-đun? Trả lời: Nó sẽ không; các mô-đun chỉ chạy một lần và sau đó được lưu vào bộ nhớ cache. Vì vậy, những gì bạn muốn làm không thể được thực hiện khá đơn giản như bạn muốn.
Tuy nhiên, bạn có thể thực hiện việc này bằng cách gọi hàm trong mô-đun debug
sau khi nhập. Bạn có thể vượt qua __name__
từ mô-đun gọi để cung cấp tên của nó, sau đó có thể lấy tham chiếu đến chính mô-đun và sau đó là các biến cấp cao nhất được xác định trong đó, một số có thể hoạt động. Những trang này sau đó có thể được trang trí.
# debug.py
import types, sys, functools
# decorator to be applied to all top-level functions in a module
def debug(fn):
@functools.wraps(fn)
def wrapper(*args, **kwargs):
print "calling", fn.__name__, "with args", *args, **kwargs
result = fn(*args, **kwargs)
print "returning from", fn.__name__, "with return value", result
return result
# decorate all top-level functions in named module with a given decorator
# (by default it is the above decorator but it could be a different one)
# This makes these functions behave as though they had been written with
# @debug above them.
def set_debug(modname, debug=debug):
module = sys.modules[modname]
for name in dir(module):
if not name.startswith("_"):
thing = getattr(module, name)
if isinstance(thing, types.FunctionType):
setattr(module, name, debug(thing))
Bây giờ trong module gọi:
# main.py
import debug
def main():
print "in main module"
debug.set_debug(__name__) # install debugging decorator
main()
cách tiếp cận đi qua các không gian tên một cách rõ ràng (chứ không phải là tên module) Jim Garrison cũng là tốt và thực sự đơn giản hoá mọi thứ một chút; bạn có thể sử dụng nó để trang trí những thứ khác ngoài mô-đun. Tôi đã phá vỡ của tôi lên để bạn có thể vượt qua trong một trang trí khác nhau nếu bạn muốn.
Bạn cần gọi hàm trong 'Debug' sau khi nhập; 'Debug' có lẽ không thể phản ánh trên mô-đun nhập khẩu trong khi chính nó đang được nhập.IMHO, bạn nên làm 'từ Debug import debug_func' và sau đó sử dụng trang trí' @ debug_func' trên những hàm cần nó. Nó sẽ không quá khó để viết một regexp có thể bình luận hoặc bỏ ghi chú tất cả các trường hợp của '@ debug_func' trong một tập tin. –
Tôi đoán bạn có thể viết một hàm 'decorate_', có chức năng như tham số, xem tất cả các mục' có thể gọi 'trong 'gobals()' và trang trí chúng, hoặc một cái gì đó tương tự. Gọi sau khi nhập. –