פילטור סטרינג ספציפי מפלט של פקודה


#1

שלום לכולם!,

אני מעוניין להוציא חלק ספציפי (סטרינג) מפלט של פקודה. במקרה זה - ספריית boto3 שמאפשרת תקשורת עם סרוויסים שונים של אמזון AWS.
קטע הקוד הבא תקין ועובד:
אך איני מצליח להציג רק חלק מהפלט,
שימוש בslice לדוגמא, לא מצליח. אני מקבל שגיאה
TypeError: unhashable type: ‘slice’
יש למישהו רעיון אחר ?

import boto3
iam = boto3.client('iam')
user = iam.get_user(UserName='<AWS_USER_NAME>')
print (user)
user[:2]

#2

הי אורן,

אין לי חשבון AWS מקונפג כדי לבדוק, אבל על פניו עושה רושם שיש לך בעיה של טיפוסי נתונים - הערך המוחזר מ get_user הוא Dictionary, אבל אתה מנסה להתיחס אליו כמו ל String.

נסה להסתכל על הערך שנמצא ב user מתוך Debugger (למשל דרך Pycharm) ותראה איזה מפתחות יש במילון כדי לקחת את הערך המתאים משם


#3

הי,
הוא אכן מסוג dict, אך כאן אני נתקל בבעיה אחרת…
הוא לא בתצורה רגילה של “מילון” dict = {key:value}
אלא כך: {‘User’: {‘UserName’: ‘username’, ‘UserId’: ‘userid’, ‘Arn’: ‘arn_number’}
ואז כל מניפולציה שאני מנסה לעשות לא עוזרת כי זה לא מבנה נכון.
אני מקבל keys בנפרד, וvalues בנפרד , אך יש המון פרטים ב values ואילו אני רוצה רק אחד ספציפי.
אז חשבתי להוסיף את כל הפלט לתוך “מילון” חדש ופה איני מוצא את הפיתרון
מה הדרך להכניס פלט לתוך מילון בסקריפט ,להדפיס אותו ואז לפלטר ?
תודה!


#4

הי,

מה הכוונה ״כל מניפולציה שאני מנסה לעשות לא עוזרת״? תוכל לתת דוגמא לקוד שאתה מנסה להריץ והודעת השגיאה שמקבל?
(אגב בשביל להדביק קוד בפורום וישראה יפה משתמשים בסימן של שלוש-פעמים-גרש-הפוך. אתה יכול ללחוץ על העיפרון בהודעה הראשונה שלך ולראות מה עשיתי שם כדי שהקוד יראה יפה)


#5

הי, אלו הדרכים שניסיתי להפעיל על התוצאה:
זה החלק מהסקריפט שלמעלה, רשמתי פה רק לצורך קונטקסט.

user = iam.get_user(UserName='<AWS_USER_NAME>')

זה הפלט:

{‘User’: {‘UserName’: ‘username’, ‘UserId’: ‘userid’, ‘Arn’: ‘arn_number’}
keys = user.keys()
print(keys)

נותן רק את הKey

print(user.get('User'))

השורה הבאה זהה ל print(user)
נותן את כל ה- values , אבל את הכל.

print(list(user.items())[0][1])

כנ"ל

print(list(user.values()))

ניסיתי להכניס את הקטע הבא ,אך משהו שם לא מתחבר כראוי , יכול להיות שיש משהו בתחביר, למרות שזה נראה הגיוני לחלוטין.

 for user in page['Users']:
  print("User: {0}\nARN: {1}\n".format(
  user['Users'],
  user['Arn']
 )
 )

לעשות את זה ידני, עובד.
אבל כל העניין שזה יתבצע באופן אוטומטי בסקריפט, וזה אני לא מצליח לפתור,שלא לדבר על לקחת פרט בודד מתוך הvalue.

>>> my_dict = dict({'UserName': 'username', 'UserId': 'userid', 'Arn': 'arn_number'})
>>> print(my_dict)
{'UserName': 'username', 'UserId': 'userid', 'Arn': 'arn_number'}
>>> type(my_dict)
<class 'dict'>
>>> my_dict[:2]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'slice'

אח"כ אמרתי, אולי אם נחלק את המילון למספר חלקים זה יעזור, אך קיבלתי שגיאה נוספת:

dict1 = dict(my_dict.items()[len(my_dict)/2:])
TypeError: 'dict_items' object is not subscriptable

ואז אחרי זה ניסיתי את זה

my_dict["Arn"]
'arn_number'

כלומר… מצאתי את הפתרון! :grinning:

אך איך להכניס את זה:

{‘User’: {‘UserName’: ‘username’, ‘UserId’: ‘userid’, ‘Arn’: ‘arn_number’}

לתוך זה ?

my_dict = dict({'UserName': 'username', 'UserId': 'userid', 'Arn': 'arn_number'})

ומדוע קיבלתי את השגיאות האחרות ? הרי פעלתי לפי ההגיון הפייתוני ?


#6

הי,

לא את כל מה שעשית הבנתי אבל רגע אולי תנסה לכתוב:

my_dict = dict(user['User'])

ואחרי זה תוכל להמשיך עם my_dict כמו בדוגמא שלך?


#7

הי,

בדקתי את ההצעה שלך, אך קיבלתי שגיאה

ValueError: dictionary update sequence element #0 has length 1; 2 is required

בכל מקרה מצאתי את התשובה.

my_dict = dict({'UserName': 'username', 'UserId': 'userid', 'Arn': 'arn_number'})
print(my_dict["Arn"])
>>>arn_number

תודה על התמיכה (-: