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()

בברכה,
   עמית

לענות