นี่คือวิธีหนึ่ง ฉันจะไม่แนะนำสิ่งนี้สำหรับสิ่งสำคัญเพราะมันจะค่อนข้างบอบบาง แต่ก็สามารถทำได้
สร้างฟังก์ชันที่ใช้inspectโมดูลเพื่อค้นหาซอร์สโค้ดที่เรียกว่า จากนั้นคุณสามารถวิเคราะห์ซอร์สโค้ดเพื่อระบุชื่อตัวแปรที่คุณต้องการดึงข้อมูล ตัวอย่างเช่นต่อไปนี้เป็นฟังก์ชันautodictที่ใช้เรียกรายการตัวแปรและส่งคืนชื่อตัวแปรการแมปพจนานุกรมเป็นค่า เช่น:
x = 'foo'
y = 'bar'
d = autodict(x, y)
print d
จะให้:
{'x': 'foo', 'y': 'bar'}
การตรวจสอบซอร์สโค้ดเองนั้นดีกว่าการค้นหาผ่านlocals()หรือglobals()เพราะวิธีหลังไม่ได้บอกคุณว่าตัวแปรใดเป็นตัวที่คุณต้องการ
ไม่ว่าจะด้วยวิธีใดก็ตามนี่คือรหัส:
def autodict(*args):
get_rid_of = ['autodict(', ',', ')', '\n']
calling_code = inspect.getouterframes(inspect.currentframe())[1][4][0]
calling_code = calling_code[calling_code.index('autodict'):]
for garbage in get_rid_of:
calling_code = calling_code.replace(garbage, '')
var_names, var_values = calling_code.split(), args
dyn_dict = {var_name: var_value for var_name, var_value in
zip(var_names, var_values)}
return dyn_dict
การกระทำที่เกิดขึ้นในบรรทัดด้วยซึ่งจะส่งกลับสตริงภายในรหัสที่เรียกว่าinspect.getouterframesautodict
ข้อเสียที่เห็นได้ชัดของเวทมนตร์ประเภทนี้คือมันทำให้สมมติฐานเกี่ยวกับวิธีการที่ซอร์สโค้ดมีโครงสร้าง และแน่นอนว่ามันจะไม่ทำงานเลยหากทำงานในล่าม
pip3 install python-varname==0.1.5; นำเข้าโดยใช้from varname import nameof