python مكتبة استرجاع اسم المتغير في بيثون في وقت التشغيل؟




مكتبة اكواد بايثون (7)

هل هناك طريقة لمعرفة ، أثناء وقت التشغيل ، اسم المتغير (من رمز)؟ أو هل نسيت أسماء var أثناء التحويل البرمجي (رمز بايت أم لا)؟

على سبيل المثال

>>>  vari = 15
>>>  print vari.~~name~~()
'vari'

ملاحظة: أنا أتحدث عن متغيرات نوع البيانات العادية (الباحث ، شارع ، قائمة ...)


هنا هي وظيفة أستخدمها لطباعة قيمة المتغيرات ، لأنها تعمل على الصعيد المحلي وكذلك globals:

import sys
def print_var(var_name):
    calling_frame = sys._getframe().f_back
    var_val = calling_frame.f_locals.get(var_name, calling_frame.f_globals.get(var_name, None))
    print (var_name+':', str(var_val))

وبالتالي فإن الكود التالي:

global_var = 123
def some_func():
    local_var = 456
    print_var("global_var")
    print_var("local_var")
    print_var("some_func")

some_func()

ينتج عنه:

global_var: 123
local_var: 456
some_func: <function some_func at 0x10065b488>

يمكنك فعلها ، إنها ليست جميلة.

import inspect, sys


def addVarToDict(d, variable):
    lineNumber = inspect.currentframe().f_back.f_lineno
    with open(sys.argv[0]) as f:
        lines = f.read().split("\n")

    line = lines[lineNumber-1]

    varName = line.split("addVarToDict")[1].split("(")[1].split(",")[1].split(")")[0].strip()
    d[varName] = variable


d = {}

a=1

print d # {}
addVarToDict(d,a)
print d # {'a': 1}

سيعمل ذلك مع أنواع البيانات البسيطة (str، int، float، list etc.)

def my_print(var_str) :
    print var_str+':', globals()[var_str]


هنا دالة أساسية (ربما غريبة) تظهر اسم حجة لها ... الفكرة هي تحليل الكود والبحث عن المكالمات إلى الوظيفة (مضافة في طريقة init يمكن أن تساعد في العثور على اسم المثيل ، على الرغم من أنه تحليل كود أكثر تعقيدا)

def display(var):
    import inspect, re
    callingframe = inspect.currentframe().f_back
    cntext = "".join(inspect.getframeinfo(callingframe, 5)[3]) #gets 5 lines
    m = re.search("display\s+\(\s+(\w+)\s+\)", cntext, re.MULTILINE)
    print m.group(1), type(var), var

يرجى ملاحظة: الحصول على عدة أسطر من كود الاتصال يساعد في حالة انقسام المكالمة كما في المثال التالي:

display(
        my_var
       )

ولكن سوف تنتج نتيجة غير متوقعة على هذا:

display(first_var)
display(second_var)

إذا لم يكن لديك التحكم في تنسيق مشروعك ، فلا يزال بإمكانك تحسين الرمز لاكتشاف وإدارة المواقف المختلفة ...

عموما أعتقد أن تحليل الكود الثابت يمكن أن يؤدي إلى نتيجة أكثر موثوقية ، ولكن أنا كسول جدا للتحقق من ذلك الآن



لا يتم نسيان أسماء المتغيرات ، يمكنك الوصول إلى المتغيرات (والبحث عن المتغيرات التي لديك) من خلال الاستبطان ، على سبيل المثال

>>> i = 1
>>> locals()["i"]
1

ومع ذلك ، نظرًا لعدم وجود مؤشرات في Python ، لا توجد طريقة للإشارة إلى متغير دون كتابة اسمه فعليًا. لذا إذا أردت طباعة اسم متغير وقيمته ، فيمكنك الانتقال عبر locals() أو وظيفة مشابهة. ( [i] يصبح [1] ولا توجد طريقة لاسترداد المعلومات التي جاءت منها 1 بالفعل من i .)







python