سؤال
أحاول تنفيذ عدد من الوظائف باستخدام eval ()، وأحتاج إلى إنشاء نوع من البيئة لتشغيلها. يقال في الوثائق التي يمكنك اجتياز globals كمعلمة ثانية للتقييم ().
ولكن يبدو أنه لا يعمل في حالتي. إليك المثال simpified (لقد جربت مناهضين، أعلن عالمي متغير واستخدام Globals ()، وكلاهما لا يعمل):
ملف script.py.:
import test
global test_variable
test_variable = 'test_value'
g = globals()
g['test_variable'] = 'test_value'
eval('test.my_func()', g)
ملف Test.py.:
def my_func():
global test_variable
print repr(test_variable)
وأنا أحصل على:
NameError: الاسم العالمي "Test_Variable" غير محدد.
ماذا علي أن أفعل لتمرير ذلك test_variable
إلى my_func()
ب على افتراض أنني لا أستطيع تمريرها كمعلمة.
المحلول
test_variable. يجب أن تكون عالمية في Test.py. يمكنك الحصول على خطأ في الاسم لأنك تحاول إعلان وجود متغير عالمي لا يوجد بعد.
لذلك يجب أن يكون ملف my_test.py مثل هذا:
test_variable = None
def my_func():
print test_variable
وتشغيل هذا من موجه الأوامر:
>>> import my_test
>>> eval('my_test.my_func()')
None
>>> my_test.test_variable = 'hello'
>>> my_test.test_variable
'hello'
>>> eval('my_test.my_func()')
hello
بشكل عام، من النموذج السيئ للاستخدام Eval () والكبراءات، لذلك تأكد من معرفة ما تفعله.
نصائح أخرى
يرجى تصحيح لي خبراء بيثون إذا كنت مخطئا. أنا أيضا تعلم بيثون. ما يلي هو فهمي الحالي لماذا NameError
تم إلقاء استثناء.
في Python، لا يمكنك إنشاء متغير يمكن الوصول إليه عبر الوحدات النمطية دون تحديد اسم الوحدة النمطية (أي للوصول إلى المتغير العمومي test
في الوحدة النمطية mod1
تحتاج إلى استخدام mod1.test
عندك في الوحدة النمطية mod2
). نطاق المتغير العالمي يقتصر إلى حد كبير على الوحدة نفسها.
وبالتالي عندما يكون لديك ما يلي test.py
:
def my_func():
global test_variable
print repr(test_variable)
ال test_variable
هنا يشير إلى test.test_variable
(بمعنى آخر test_variable
في ال test
مساحة الاسم الوحدة النمطية).
لذلك وضع test_variable
في script.py
سوف يضع المتغير في __main__
مساحة الاسم (__main__
لأن هذا هو الوحدة / البرنامج النصي من المستوى الأعلى الذي قدمته إلى مترجم ثعبان للتنفيذ). وهكذا، هذا test_variable
سيكون في مساحة اسم مختلفة وليس في test
مساحة الاسم الوحدة النمطية حيث يلزم أن تكون. وبالتالي، فإن بيثون يولد NameError
لأنه لا يمكن العثور على المتغير بعد البحث test
مساحة الاسم العالمية الوحدة النمطية واسم المسام المدمجة (يتم تخطي مساحة اسم الوظيفة المحلية بسبب global
بيان).
لذلك، ل eval
للعمل، تحتاج إلى تعيين test_variable
في ال test
وحدة الاسم الوحدة النمطية في script.py
:
import test
test.test_variable = 'test_value'
eval('test.my_func()')
لمزيد من التفاصيل حول نطاق Python وسماح المساحات المسمير: http://docs.python.org/tutorial/classes.html#python-scopes-and-name-spaces.