python - لغة - مكتبة اكواد بايثون




استرجاع اسم المتغير في بيثون في وقت التشغيل؟ (6)

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

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

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

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



سيعمل ذلك مع أنواع البيانات البسيطة (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)

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

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


وتستمر أسماء المتغيرات في الشفرة المترجمة (وهي الطريقة التي يمكن أن يعمل بها dir على سبيل المثال) ، ولكن التعيين الموجود هناك ينتقل من الاسم إلى القيمة ، وليس العكس. لذلك إذا كانت هناك عدة متغيرات جميعها تستحق ، على سبيل المثال ، 23 ، فلا توجد طريقة لإخبارهم من كل قاعدة أخرى فقط عن القيمة 23 .


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

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}






python