אני קצת משתגעת פה ואשמח לגאולה.
בתרגיל ימצי קיבלתי הערות על 2-3 list comprehension שעשיתי - התבקשתי לשנות אותן ל-list().
בתור הבחורה הצייתנית שאני, זה בדיוק מה שעשיתי, ולאחר שהעלתי את התרגיל מחדש קורנת מאושר, חשכו עיניי - התבקשתי לעשות את הדבר ההפוך - להפוך את הרשימות שהמרתי כל כך יפה בחזרה ל-list comprehension. אני מרגישה תקועה בלולאה אינסופית!
אני אובדת עצות בשלב הזה, ואודה לעזרה לפני שהבודק ואני נפתח בקרב אורטל קומבט שככל הנראה יגמר ברע.
תודה מראש!
Yam
קישור?
adva.alkalay
סליחה על הבורות, אבל מה הכוונה?
Yam
קישור לתרגיל שהגשת במערכת התרגילים, כדי שאוכל לראות מה הבודק אומר
כלומר, לצורך העניין אם הייתי רוצה ליצור רשימה של 1-10, לא סביר להשתמש ב-list comprehension?
ותודה כמובן על המענה!
Yam
תקין, בהחלט, פשוט מעט עבודה מיותרת.
את הופכת את range ל־generator בעזרת generator expression ואז את ממירה אותו לרשימה.
עדיף פשוט מלכתחילה להמיר לרשימה
adva.alkalay
אפשר המחשה בבקשה למען הראש המסוחרר שלי?
Yam
נסי לעקוב אחרי זו שהבאתי בתגובה למעלה, עם הקוד
adva.alkalay
עוקבת, מבטיחה! ועם זאת אני מרגישה שהכל תקין ועדיין מבולבלת.
אפשר לשאול איך היית כותב את הקוד הזה מבלי עבודה מיותרת?
אני פשוט לא מצליחה לחשוב על כתיבה שהיא לא שימוש ב-list comprehension, והרי ההערות הן על שני הניסוחים שלי.
b = list(number for number in range(1, 10))
b = [number for number in range(1, 10)]
חיפוש בגוגל מביא אותי לכתיבה השנייה לצורך העניין
עריכה:
העמקה נוספת בגוגל הביאה אותי ל-list(range(1, 10)! אוקיי! אך מה לגבי השאר?
Yam
ברור, בואי נגיע לזה יחד.
הפונקציה range מחזירה לנו iterator שבו יש הרבה ערכים.
יכולה לממש עבורי generator שמקבל start ו־end ומחזיר כל פעם איבר אחד? (כמו range)
adva.alkalay
הבנתי! ממש תודה על הסבלנות. ילדה צייתנית אך עובדת שעות נוספות כשאין צורך.
ההערות היחידות שנשארו לי בתרגיל הן של ה-request, הבנתי שמהן ניתן להתעלם?
(קיים תנאי שבודק אם הכתובת מתחילה ב-http)
Yam
ניסית דרכים אחרות לפתור את ההערה?
adva.alkalay
אני יכולה להשתמש באותה הדרך שבחרתי להוציא את המידע מהדף בויקיפדיה, פשוט בחרתי בדרך של להוריד את הקובץ למחשב מטעמי נוחות. האם זו הכוונה?
Yam
לא, מה שבחרת זה אחלה. פשוט מקריאה באינטרנט נראה שיש דרכים נוספות לפתור את ההערה של הבודק האוטומטי
adva.alkalay
עוד ממשיכה לחפור באינטרנט ועוד לא מוותרת, פשוט הדרך שראיתי גם בפורום וגם בחיפוש הנוכחי בגוגל לא עובדת, ואני רק רוצה לוודא שיש עוד דרך.
import urllib.request
req = urllib.request.Request('http://www.example.com')
with urllib.request.urlopen(req) as response:
the_page = response.read()
זה כמובן לא עבד לי, כמו גם לבדוק אם ה-url מתחיל ב-http ולהעלות שגיאה אם לא:
if url.lower().startswith('http'):
req = urllib.request.Request(url)
else:
raise ValueError("Invalid URL")
with urllib.request.urlopen(req) as response:
the_page = response.read()
אלו בינתיים הדרכים הכי נפוצות שמצאתי באינטרנט, מקווה למצוא משהו אחר בהמשך החפירה.
אם יש עוד הכוונה כמובן שאשמח! ושוב תודה!
עדכון:
פתרתי את הבעיה באמצעות החלפה למודול אחר,
אבל עדיין תוהה אם אפשר לפתור את זה עם urlib.request
לייק 1
Yam
מעניין, אבל אני רואה שבמערכת זה באמת ממשיך לתת את השגיאה למרות שווידאת קלט.
הוא באמת קצת מעצבן, אעיף את השגיאה הזו מהמערכת.
בכ"מ טוב שלמדת להשתמש ב־requests, הוא מודול מוצלח יותר למטרות האלו
כן, חיפושיי לימדו אותי שכולם ממש עפים עליו. צריכה להכיר אותו יותר לעומק
אז אבטחתית הוא נחשב טוב יותר?
לייק 1
Yam
בגלל סיבות קצת מוזרות. הבעיה שהוצגה לך אומרת שמישהו בטעות יכול להכניס file:// בתחילת הקישור, ו־urlopen יפתח את זה.
זה אומר שמשתמש עלול להיות מסוגל לקרוא דברים ממערכת הקבצים המקומית שממנה מופעל הסקריפט, אז אם מדובר בשרת שרץ מרחוק משתמש (אולי) יוכל לקרוא/לכתוב לקבצים בשרת, וזה מסוכן מאוד.
ל־requests אין את הפיצ’ר הזה – היא קוראת רק מ־http/https וככה יוצא שהיא בטוחה יותר