سؤال

أحاول تنفيذ عدد من الوظائف باستخدام 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top