🔹 چطور بدون پاس دادن اسم تابع، بفهمیم کی کدمون رو صدا زده؟
فرض کن داری یک سیستم لاگین یا دیباگ مینویسی و میخوای دقیقاً بدونی تابع فعلی از کجا و توسط چه تابعی فراخوانی شده، بدون اینکه مجبور باشی دستی اسم تابع رو ورودی بدی.
import sys
def trace_caller():
# عدد 1 یعنی یک فریم برو عقبتر (جایی که این تابع صدا زده شده)
caller_frame = sys._getframe(1)
func_name = caller_frame.f_code.co_name
line_no = caller_frame.f_lineno
file_name = caller_frame.f_code.co_filename
print(f"📍 Called from: {func_name}() at line {line_no} in {file_name}")
def user_login():
# بدون پاس دادن هیچ پامتر اضافی!
trace_caller()
user_login()
🔹 چطوری کار میکنه؟
* sys._getframe(0):
فریم حال حاضر (همین جابی که هستیم).
* sys._getframe(1):
فریم فراخوانکننده (یک پله عقبتر در Stack call).
* f_code.co_name:
اسم تابعی که کد توش اجرا شده.
* f_locals:
حتی میتونی به متغیرهای محلیِ تابع فراخوانکننده هم دسترسی پیدا کنی!
🔹 نکته امنیتی/معماری:
پیشوند _ نشون میده این یک متد درونی در CPython است. برای منطق اصلی برنامه (Business Logic) ازش استفاده نکن، اما برای دیباگرها، ساخت دکوراتورهای هوشمند و ابزارهای Logging یک سلاح مخفی و فوقالعادهست!
🐍 @python_rd