it-swarm.asia

تنسيق السلاسل والوسيطات المسماة في Python

حالة 1:

"{arg1} {arg2}".format (10, 20)

سيعطي KeyError: 'arg1' لأنني لم أجتز الوسيطات المسماة.

الحالة 2:

"{arg1} {arg2}".format(arg1 = 10, arg2 = 20)

الآن سوف تعمل بشكل صحيح لأنني مررت على الحجج المسماة. وتطبع '10 20'

القضية 3:

وإذا تم تمرير اسم خاطئ ، فسيظهر KeyError: 'arg1'

 "{arg1} {arg2}".format(wrong = 10, arg2 = 20)

لكن،

القضية 4:

إذا قمت بتمرير الوسائط المسماة في ترتيب خاطئ

"{arg1} {arg2}".format(arg2 = 10, arg1 = 20)

إنه يعمل ...

وتطبع '20 10'

سؤالي هو لماذا يعمل وما هو استخدام الحجج المسماة في هذه الحالة.

64
bkmagnetron

تطابق حقول الاستبدال المسماة (الأجزاء {...} في سلسلة format ) وسيطات الكلمة الأساسيةإلى طريقة .format() ، وليس الوسائط الموضعية.

تشبه وسيطات الكلمات الأساسية مفاتيح في القاموس ؛ لا يهم الطلب ، حيث يتم مطابقته مع اسم.

إذا كنت ترغب في التطابق مع الموضعالوسائط ، فاستخدم الأرقام:

"{0} {1}".format(10, 20)

في Python 2.7 وما فوق ، يمكنك حذف الأرقام. ثم يتم ترقيم حقول الاستبدال {} تلقائيًا بترتيب ظهورها في سلسلة التنسيق:

"{} {}".format(10, 20) 

يمكن أن تتطابق سلسلة التنسيق مع كل من الموضعين ووسيطات الكلمة الأساسية ، ويمكن أن تستخدم الوسائط عدة مرات:

"{1} {ham} {0} {foo} {1}".format(10, 20, foo='bar', ham='spam')

اقتباس من مواصفات سلسلة التنسيق :

field_nameنفسه يبدأ بحرف arg_nameالذي هو إما رقم أو كلمة أساسية . إذا كان رقمًا ، فسيشير إلى وسيطة موضعية ، وإذا كانت كلمة رئيسية ، فإنها تشير إلى وسيطة الكلمة المسماة.

التركيز الألغام.

إذا كنت تقوم بإنشاء سلسلة تنسيق كبيرة ، فغالبًا ما يكون استخدام حقول الاستبدال المسماة أكثر قابلية للقراءة وصيانتها ، لذلك ليس عليك الاستمرار في عدّ الوسيطات ومعرفة الوسيطة التي تذهب إلى السلسلة الناتجة.

يمكنك أيضًا استخدام بناء جملة استدعاء **keywords لتطبيق قاموس موجود على تنسيق ما ، مما يجعل من السهل تحويل ملف CSV إلى إخراج منسق:

import csv

fields = ('category', 'code', 'price', 'description', 'link', 'picture', 'plans')
table_row = '''\
    <tr>
      <td><img src="{picture}"></td>
      <td><a href="{link}">{description}</a> ({price:.2f})</td>
   </tr>
'''

with open(filename, 'rb') as infile:
    reader = csv.DictReader(infile, fieldnames=fields, delimiter='\t')
    for row in reader:
        row['price'] = float(row['price'])  # needed to make `.2f` formatting work
        print table_row.format(**row)

هنا ، picture ، link ، description و price ، كلها مفاتيح في القاموس row ، وهي أسهل بكثيرلمعرفة ما يحدث عندما أقوم بتطبيق row على سلسلة التنسيق.

104
Martijn Pieters