ورود

View Full Version : دسترسی به متغییرهای گلوبال برنامه در یک ماجول import شده



eshpilen
جمعه 01 بهمن 1389, 20:30 عصر
test1.py


import test2

i=402
test2.f()
input('...')


test2.py


def f():
print(i)


با اجرای test1.py ما با خطای global name 'i' is not defined مواجه میشیم.
چطور میشه به متغییرهای گلوبال برنامه در ماجول import شده دسترسی داشت؟
بنده فعلا از این روش استفاده میکنم:

test2.i=i
test2.f()

کلا هم بنظرتون استفاده از این روش بخاطر استفاده از متغییرهای گلوبال برای انتقال اطلاعات بین ماجول اصلی و توابع موجود در ماجول های import شده احتمالا از نظر اصول طراحی نرم افزار ایراد داره؛ نه؟ البته روشی که بنده استفاده میکنم ظاهرا اون حالت رو نداره. من یکسری توابعی در یک ماجول دارم که از پارامترهای مشترکی استفاده میکنن که از برنامهء اصلی به این روش میگیرن، و نمیخوام در هر بار اجرای هر تابع مجبور باشم این متغییرها رو بهشون پاس کنم. البته احتمالا تعریف بصورت یک کلاس، بجای توابع گلوبال در یک ماجول، راهکار اصولی هست.
بجاش چه روشی رو پیشنهاد میکنید؟

franchesco
شنبه 02 بهمن 1389, 07:21 صبح
دوست عزیز شما باید متغییرتون رو به صورت global معرفی کنید

http://docs.python.org/release/2.0.1/ref/global.html

eshpilen
شنبه 02 بهمن 1389, 08:36 صبح
نه اینو قبلا امتحان کردم و جواب نداده. الان بازم حالات مختلفش رو تست کردم.
ظاهرا متغییرهای گلوبال هر ماجولی مجزا هستن. یعنی این گلوبال فقط در ماجول خودش اثر داره و مثلا برای دسترسی به متغییرهای گلوبال در داخل یک تابع که در همون ماجول باشه بکار میره.

r00tkit
شنبه 02 بهمن 1389, 09:32 صبح
a.py:
var = 1
b.py:
import a
print a.var

eshpilen
شنبه 02 بهمن 1389, 09:44 صبح
شما که قضیه رو برعکس کردی!!
میخوام ماجول ایمپورت شده به متغییرهای ماجول اصلی دسترسی داشته باشه، نه ماجول اصلی به متغییرهای ماجول ایمپورت شده.

MSK
شنبه 07 اسفند 1389, 20:56 عصر
دوست عزیز من اگه جای شما باشم، متغیرهایی رو که بطور سراسری ازش استفاده می‌کنم رو توی یک فایل مجزا قرار میدم و هرجا که ازشون استفاده می‌کنم ایمپورتشون می‌کنم:




global.py:
i=None


test1.py:
from global import i
i = 12
import test2
test2.f()

test2.py:
from global import i

def f():
print(i)

eshpilen
یک شنبه 08 اسفند 1389, 19:18 عصر
بله این روش رو قبلا دوست دیگری هم در سایت pylearn مطرح کردن. موضوع مختومه هست.
بهرحال بنظرم برای این کار راه مستقیمی نیست و همونی که خودم بکار بردم مناسبتر بود برای کاربرد بنده.