TGViewer
PyCoders (پایتون) PyCoders (پایتون) @python_rd · 4.1K subscribers
Post #2166 395
🔆 فرمول کثیف اما کاربردی sys._getframe تو پایتون؛ ابزاری که معمولاً تو کدبیس‌های معمولی نمی‌بینی اما برای دیباگ، لاگین پیشرفته و ساخت فریم‌ورک‌ها مثل معجزه عمل می‌کنه.


🔹 چطور بدون پاس دادن اسم تابع، بفهمیم کی کدمون رو صدا زده؟

فرض کن داری یک سیستم لاگین یا دیباگ می‌نویسی و می‌خوای دقیقاً بدونی تابع فعلی از کجا و توسط چه تابعی فراخوانی شده، بدون اینکه مجبور باشی دستی اسم تابع رو ورودی بدی.
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
  • ❤ 1
More from @python_rd
  1. Oct 13, 2026کوییز پایتون 🔆 خروجی اجرای کد زیر چیست؟ t = (1, 2, [3, 4]) try: t[2] += [5] except TypeEr…
  2. Oct 13, 2026🔆 راز مکانیزم پیاده‌سازی و تغییر جهت NaN در الگوریتم مرتب‌سازی پایتون (Timsort) 🔹 باگ ری…
  3. Oct 13, 2026🔆 حذف تاریخی GIL از پایتون (Free-threaded Python) 🔹 یک رویداد تاریخی: حذف قفل مفسر (GIL)…
  4. Oct 11, 2026🔆 مدیریت تمیز منابع با Context Managerهای سفارشی (contextlib) 🔹 ساخت Context Managerها م…
  5. Oct 10, 2026🔆 چرا برای داده‌های حجیم نباید از return استفاده کنی؟ 🔹 وقتی یک تابع لیست بزرگی از داده‌…
  6. Oct 10, 2026🔆 خروجی این تکه کد چیه؟ def add_item(item, lst=[]): lst.append(item) return lst print(add…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →