Shlomi Fish wrote: > On Saturday 16 July 2005 23:47, Amit Aronovitch wrote: > >> הי, >> >> 1) קודם כל רציתי להעיר שלפעמים יותר פשוט (וגם יותר מדמה את המצב האמיתי >> שאתה בודק) פשוט לדרוך על המשתנים הרלוונטיים במודול הקיים. במקרה שלך >> למשל, היה מספיק לעשות: >> >> import cgi >> cgi.FieldStorage = get_params >> >> (כאשר אתה עושה import mytestcgi המודול cgi לא יאותחל מחדש, כי הוא כבר ב- >> sys.modules). >> > > כן, אבל אז אני מעלה את המודול האמיתי, שיגרום להרבה תוצרי-לוואי, וכן יגרום > לתוכנית הבדיקה להיכשל משום שהיא טוענת את "cgi" מבלי שתורץ מתוך שרת וו'ב. > לא נראה לי שטעינת המודול לכשעצמה אמורה לעשות איזושהי בעיה. לגבי תוצרי לואי אחרים - אולי הם אפילו רצויים - תלוי מה אתה רוצה לבדוק.
> >נראה שזה עובד: > ><<<<<<<<<<<<<<<< >#!/usr/bin/python > >import cgi > >def run_main(): > form = cgi.FieldStorage() > > print "Content-Type: text/html\n\n" > > print form["hello"].value; > >if __name__ == "__main__": run_main() > > >וכן: > ><<<<<<<<<<<<< >import sys >import new >from StringIO import StringIO > >class cgi_param: > def __init__(self, value): > self.value = value > def value(self): > return self.value > >def get_params(): > return {"hello":cgi_param("ShlomifTest")} > >cgi_mod = new.module("cgi"); >cgi_mod.FieldStorage = get_params > >save_stdout = sys.stdout >sys.stdout = StringIO() >import mytestcgi > >mytestcgi.cgi = cgi_mod >mytestcgi.run_main() >buffer = sys.stdout.getvalue() > >sys.stdout = save_stdout > >if (buffer == "Content-Type: text/html\n\n\nShlomifTest\n"): > print "ok" >else: > print "not ok: buffer == " + buffer > > >ככל הנראה "import cgi" לא מבצע פעילות כלשהי כשלעצמו שתגרום לו להתנהג מוזר כאשר >הוא לא רץ כתסריט CGI. אבל אם פעולת ה-import הייתה עושה משהו כזה, אז לא ניתן >היה להשתמש בטריק הזה. > > זה לא במקרה. מדובר במודול ספריה סטנדרטית, וככזה ניתן לצפות ממנו להתנהג בצורה מקובלת (כלומר, כפי שאמרתי קודם: import לא אמור לעשות דברים משונים) אגב - סתם למקרה שלא חשבת על זה (זה לא בהכרח יותר טוב) - אין שום דרישה שהאוביקט שאתה שם שם יהיה דוקא מודול. כל אוביקט שיש לו attribute בשם FieldStorage יהיה טוב באותה מידה. למשל: class UseClassAsCGIModule: def FieldStorage(): return {"hello":cgi_param("hello")} class UseInstanceAsCGIModule: def FieldStorage(self): return {"hello":cgi_param("hello")} #now, you can use either: mytestcgi.cgi = UseClassAsCGIModule #or: mytestcgi.cgi = UseInstanceAsCGIModule() בברכה, עמית