Trong Python, tôi có một trình trang trí phải bỏ qua bất kỳ công việc thực nào nếu một hàm được định nghĩa cục bộ trong một hàm gọi nó. Tôi đã thực hiện một kịch bản thử nghiệm đơn giản:Cách phát hiện xem một hàm đã được xác định cục bộ chưa?
def fn1():
# @my_decorator will be here
def fn2():
pass
print(fn2)
return fn2
x = fn1()
print(x)
print(x.__module__)
It in này:
<function fn1.<locals>.fn2 at 0x7fd61bdf3ae8>
<function fn1.<locals>.fn2 at 0x7fd61bdf3ae8>
__main__
Như tôi thấy, Python thấy rằng hàm được định nghĩa trong một không gian địa phương (<locals>
trong văn bản in), nhưng tôi không thể thấy cách tôi có thể tìm thấy dữ liệu đó. Tôi đã đi qua mô-đun inspect
và không thấy bất kỳ điều gì tương tự.
Tôi không thể dựa vào việc hàm có trong hình cầu hay không.
Tôi nên sử dụng cái gì?
Tôi nghĩ đây là giải pháp hợp pháp tốt. '__qualname__' cũng là những gì được sử dụng (trong CPython ít nhất) để tạo' repr' của hàm, không có thuộc tính ẩn nào khác mà nó kiểm tra. –
@JimFasarakisHilliard vâng, tôi đang chơi với 'inspect.currentframe(). F_back.f_locals là globals()', có vẻ như cũng hoạt động, nhưng tôi thích điều đó ngay cả * ít hơn *. –