أكثر

كيف تحصل على ميزات بناءً على سماتها باستخدام Python - أحرف خاصة؟

كيف تحصل على ميزات بناءً على سماتها باستخدام Python - أحرف خاصة؟


أرغب في الحصول على ميزات بناءً على سماتها وهي تعمل بشكل جيد عندما أستخدم نص Python النصي:

Canvas = iface.mapCanvas () curLayer = canvas.currentLayer () it = curLayer.getFeatures (QgsFeatureRequest (). setFilterExpression ('"ELAVSNAVN" = ' Fraugde By و Fraugde  'و "MATRNR" = ' 15g  ") ) للقاعدة الميزة فيه: print baseFeature.id ()

لكن لا يتم إرجاع أي شيء عند استخدام أحرف دانمركية خاصة كما هو موضح في هذا المثال:

it = curLayer.getFeatures (QgsFeatureRequest (). setFilterExpression ('"ELAVSNAVN" = ' Åsum By و Åsum  'و "MATRNR" = ' 10a  "))

ما الذي يمكنني فعله لحل هذه المشكلة؟


تأكد من أنك تستخدم سلسلة unicode في Python لأشياء من هذا القبيل:

التعبير = u '"ELAVSNAVN" = ' Åsum By و Åsum  'و "MATRNR" = ' 10a  "

واجهت مشاكل مماثلة في البرنامج المساعد qgis2leaf الخاص بي لـ QGIS. لذلك استخدمت "إعادة الاستيراد" وطرقها. لذلك أقوم بتغيير اسم كل طبقة مثل هذا:

بالنسبة لـ i في النطاق (len (self.layer_list)): self.layer_list [i] = re.sub ('[ W _] +'، "، self.layer_list [i] .text ())

ربما هذا يساعد ...


كيف تحصل على ميزات بناءً على سماتها باستخدام Python - أحرف خاصة؟ - نظم المعلومات الجغرافية


تتكون هذه القائمة من 16 مشكلة يتم العثور عليها بشكل شائع أثناء اختبارات اختراق البنية التحتية الداخلية وتقييمات الضعف. إنه ليس شيئًا معقدًا أو جديدًا بشكل رهيب ، مجرد قائمة من المشاكل النموذجية.

تم تنظيم القائمة بطريقة عشوائية & # 8211 وبالتالي فهي أشبه بقائمة مرجعية وليست قائمة ترتيب مرتبة.

1. للمستخدمين حقوق إضافة أجهزة كمبيوتر إلى المجال

في التثبيت الافتراضي لـ Active Directory ، يمكن لأي مستخدم مجال إضافة محطات عمل إلى المجال. يتم تحديد ذلك من خلال السمة ms-DS-MachineAccountQuota والتي يتم تعيينها افتراضيًا على 10.

هذا يعني أن أي مستخدم ذي امتياز منخفض يمكنه الانضمام إلى ما يصل إلى 10 أجهزة كمبيوتر إلى المجال. حسنًا ، ربما لا يكون رائعًا ، ولكن ما هي الصفقة الكبيرة؟

تكمن المشكلة في أن هذه الإعدادات تسمح لأي مستخدم بالانضمام إلى جهاز الكمبيوتر الخاص بنا غير المدار للوصول إلى مجال الشركة بالمزايا التالية:

  • لن يتم دفع أي من حلول مكافحة الفيروسات أو EDR إلى أجهزتهم
  • لن يتم تطبيق أي إعدادات أو سياسات GPO على نظامهم
  • يسمح لهم بالحصول على حقوق إدارية في نظامهم

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

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

لذلك يجب ألا يُسمح أبدًا للمستخدمين بربط أجهزة الكمبيوتر بالمجال.

كيف تختبر

أسهل طريقة لاختبار ذلك هي أن يكون لديك جهاز اختبار Windows (فعلي أو جهاز افتراضي) متصل بشبكة الشركة المستهدفة حتى يتمكن من الوصول إلى وحدات التحكم بالمجال.

1) قم بتشغيل & # 8216sysdm.cpl & # 8217 لفتح & # 8216 خصائص النظام & # 8217 - & gt انقر فوق & # 8216 تغيير & # 8217 وقم بتوفير اسم المجال الهدف:

2) الآن ستتم مطالبتنا بأوراق الاعتماد. قم بتوفير أي بيانات اعتماد لمستخدم المجال ذي الامتيازات المنخفضة.

إذا نجحت ، يجب أن نرى رسالة & # 8220Welcome to the org.local domain! & # 8221 ويجب إضافة آلة الاختبار الخاصة بنا إلى AD ضمن حاوية CN = Computers.

بدلاً من ذلك ، يمكننا أيضًا ضم آلة الاختبار الخاصة بنا إلى AD باستخدام أمر PowerShell التالي:

بعد إعادة تشغيل آلة الاختبار الخاصة بنا ، يجب ربط الجهاز بشكل كامل بالمجال.

3) الآن يجب أن نكون قادرين على التحقق من أن جهاز الكمبيوتر الخاص بنا قد تمت إضافته بالفعل إلى المجال من خلال سرد أجهزة كمبيوتر المجال.

لاحظ أنه إذا كان لدينا وصول إلى وحدات التحكم بالمجال ، فإليك كيف يمكننا سرد جميع أجهزة الكمبيوتر التي تمت إضافتها من قبل غير المسؤولين:

2. تعيين سمة AdminCount على المستخدمين العاديين

تُستخدم سمة AdminCount في Active Directory لحماية المستخدمين الإداريين وأعضاء المجموعة ذات الامتيازات مثل:

  • إدارة المجال
  • مديري المؤسسة
  • إدارة المخطط
  • مشغلي النسخ الاحتياطي
  • مشغلي الخادم
  • الناسخ
  • إلخ.

تعتبر الأعمال الداخلية المتعلقة به موضوعًا معقدًا تمامًا يتضمن كائن AdminSDHolder وعملية SDProp التي تقوم بتعديل هذه الحسابات بشكل دوري. لجعل القصة الطويلة قصيرة ، لا ينبغي أبدًا تعيين سمة AdminCount على المستخدمين العاديين ، لأنها يمكن أن تمنحهم امتيازات عالية غير ضرورية.

على سبيل المثال ، يمكن أن يمنع هذا المستخدمين من تطبيق سياسات مجموعة الشركة وتعديلات قائمة التحكم بالوصول (ACL) ، أو من ناحية أخرى يمكن أن يؤدي إلى منحهم امتيازات عالية (انظر متجه الهجوم المستمر الموضح هنا). على أي حال ، يمثل هذا خطر وجود & # 8220backdoor & # 8221 مستخدمين في المؤسسة دون معرفة ذلك.

تكمن المشكلة في أنه يتم تعيين سمة AdminCount على 1 تلقائيًا عندما يتم تعيين مستخدم إلى أي مجموعة ذات امتياز ، ولكن لا يتم إلغاء تعيينها تلقائيًا عند إزالة المستخدم من هذه المجموعة (المجموعات).

يمكن أن يؤدي هذا إلى وجود مستخدمين ذوي امتيازات منخفضة مع تعيين AdminCount على 1 دون أن يكونوا أعضاء في أي مجموعة ذات امتياز.

كيف تختبر

من أجل العثور على مستخدمين مع ضبط سمة AdminCount على 1 ، يمكننا استخدام أداة LDAPDomainDump. تجمع هذه الأداة معلومات حيوية حول جميع المستخدمين والمجموعات وأجهزة الكمبيوتر في المجال. كل ما نحتاجه هو بيانات اعتماد أي مستخدم مجال ذي امتيازات منخفضة والقدرة على الوصول إلى منفذ LDAP لأي وحدة تحكم بالمجال.

1) قم أولاً بجمع المعلومات من وحدة تحكم المجال:

لاحظ أنه بدلاً من كلمة المرور ، يمكننا أيضًا توفير تجزئة NTLM (تمرير التجزئة).

2) بمجرد الانتهاء من التفريغ ، يمكننا الحصول على قائمة المستخدمين مع تعيين سمة AdminCount على 1 عن طريق تحليل ملف & # 8216domain_users.json & # 8217:

بدلاً من ذلك ، إذا كان لدينا وصول إلى وحدات التحكم بالمجال ، فيمكننا الحصول على قائمة بهؤلاء المستخدمين مثل هذا:

بمجرد أن نحصل على قائمة المستخدمين المتأثرين ، يجب أن نتحقق مما إذا كانوا ينتمون حقًا إلى أي مجموعة ذات امتياز أو مجموعة إدارية.

3. ارتفاع عدد المستخدمين في المجموعات ذات الامتيازات

تتعلق هذه الثغرة بوجود عدد كبير من المستخدمين في مجموعات الامتيازات مثل:

إن وجود عدد كبير من المستخدمين في مجموعات ذات امتياز يزيد دون داعٍ من خطر اختراق المجال ، لأنه إذا تعرض بعض هؤلاء المستخدمين للاختراق ، فهذا يعني اختراق كامل للمجال.

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

لقد رأينا عمليات نشر إعلان مع صفر مستخدمين في هذه المجموعات وعملوا بشكل جيد. يمكن إنجازه.

كيف تختبر

من أجل اختبار ذلك ، نحتاج فقط إلى حساب مجال منخفض الامتياز.

هنا & # 8217s كيفية تعداد هذه المجموعات من مجال انضم إلى جهاز Windows:

على جهاز Windows غير متصل ، سيتعين علينا المصادقة على المجال أولاً:

إليك & # 8217s كيف يمكننا اختبار ذلك من Linux (مثل Kali Linux) باستخدام الأمر & # 8216net & # 8217:

إذا كان هناك عدد كبير جدًا من المستخدمين في أي مجموعة ، فيجب عمل شيء حيال ذلك.

4. حسابات الخدمة كونها أعضاء في المجال الإداري

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

تكمن المشكلة في حصول هذه الحسابات على امتيازات و / أو عضويات باهظة ، مثل إضافتها إلى مجموعة & # 8220Domain Admins & # 8221 على سبيل المثال.

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

هذا يعني أنه في حالة اختراق حساب الخدمة المعرض للخطر ، فإنه سيسمح للمهاجم بالسيطرة الكاملة على مجال AD. ولفترة طويلة على الأرجح.

كيف تختبر

ما عليك سوى مراجعة جميع الأعضاء الذين ينتمون إلى المجموعات المميزة:

في Linux ، يمكننا استخدام الأمر & # 8216net & # 8217 كما هو موضح في الثغرة الأمنية السابقة.

إذا كان هناك أي حسابات خدمة في أي من هذه المجموعات ، فيجب علينا وضع علامة عليها.

5. الامتيازات الزائدة التي تسمح لمشرفي مجال الظل

هذه الثغرة الأمنية أكثر تعقيدًا. & # 8217s حول إساءة استخدام حقوق Active Directory والحقوق الموسعة ، مثل إدخالات التحكم في الوصول (ACEs).

المشكلة هي عندما يتم منح بعض هذه الحقوق لمستخدم ذي امتيازات منخفضة (أو مجموعة) للسماح بتغيير شيء مهم على مستخدم ذي امتيازات أعلى (أو مجموعة).

تتضمن بعض الحقوق التي يُساء استخدامها عادةً ما يلي:

  • ForceChangePassword & # 8211 القدرة على إعادة تعيين كلمة المرور لمستخدم آخر
  • عام & # 8211 تحكم كامل في كائن (قراءة / كتابة)
  • GenericWrite & # 8211 تحديث أي سمات لكائن
  • اكتب المالك & # 8211 افتراض ملكية كائن
  • اكتب & # 8211 تعديل DACL لكائن
  • الذات & # 8211 تعديل الذات بشكل تعسفي

يمكن أن يكون لهذه الأشياء تأثير حاسم وغالبًا ما تؤدي إلى امتيازات مسؤول المجال. يُطلق على المستخدمين الذين يتمتعون بمثل هذه الامتيازات المفرطة اسم الظل المشرفين (أو المشرفين المخفيين).

هنا & # 8217s مقالة جيدة جدًا تصف هذه المشكلة بمزيد من التفصيل مع أمثلة:

كيف تختبر

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

واحدة من الأدوات التي تساعد بشكل كبير في هذه العملية هي Bloodhound. هنا & # 8217s استخدامه باختصار:

1) استخدمنا أولاً & # 8220ingestor & # 8221 لجمع البيانات من بيئة AD & # 8211 على سبيل المثال شاربهاوند.

2) ثم نقوم بتحميل البيانات في واجهة المستخدم الرسومية للواجهة الأمامية حيث يمكننا تصور العلاقات بين الكائنات.

ثم تسمح لنا لغة الاستعلام Bloodhound بالعثور على مسارات مثل هذا المثال:

عندما نبحث عن هذه التكوينات الخاطئة للحقوق والثقة ، فسنبدأ عادةً بالاستعلامات المعدة مسبقًا مثل:

  • & # 8220 العثور على أفضل 10 مستخدمين مع معظم حقوق المسؤول المحلي & # 8221
  • & # 8220 البحث عن أقصر المسارات لمسؤولي المجال & # 8221
  • & # 8220Map مجال الثقة & # 8221
  • إلخ.

الفكرة هي إيجاد مسار لمجموعة & # 8220Domain Admins & # 8221 من موقعنا الحالي ومستوى الامتيازات.

فيما يلي بعض الاستفسارات التي يمكن أن تساعد (link1 ، link2).

6. حسابات الخدمة عرضة لـ Kerberoasting

Kerberoasting هو ناقل هجوم شائع جدًا يستهدف حسابات الخدمة في Active Directory.

تكمن المشكلة في وجود كلمات مرور ضعيفة لحسابات الخدمة وعندما يكون هناك ضعف في تشفير Kerberos RC4 المستخدم لتشفير كلمات المرور الخاصة بهم.

هنا & # 8217s الورقة الأصلية (الشرائح) من Tim Medin & # 8211 مؤلف Kerberoasting:

كيف تختبر

تمت أتمتة هذا الهجوم بواسطة أدوات متعددة (مثل Impacket أو Rubeus) وكل ما نحتاجه للاختبار هو الحصول على أي بيانات اعتماد لمستخدم مجال ذي امتيازات منخفضة.

هنا & # 8217s مثال باستخدام Impacket:

لاحظ أنه بدلاً من كلمة المرور ، يمكننا أيضًا استخدام تجزئة NTLM (تمرير التجزئة).

إذا حصلنا على بعض التجزئة ، فهذا يعني أن هناك حسابات خدمة عرضة لـ Kerberoasting.

بعد أن حصلنا على التجزئة ، يمكننا محاولة كسرها لإظهار التأثير بشكل كامل. هنا & # 8217s مثال على استخدام Hashcat لتنفيذ هجوم القاموس:

هذا ما يجب أن ننصح به عملائنا عندما يتعلق الأمر بحماية حسابات الخدمة من Kerberoasting:

  • استخدم خوارزميات تشفير أحدث مثل AES128 أو AES256 أو أفضل
  • فرض استخدام كلمات مرور قوية ومعقدة (من الناحية المثالية أكثر من 25 حرفًا في الطول)
  • تأكد من انتهاء صلاحية كلمة المرور الخاصة بهم بشكل دوري
  • حافظ على امتيازاتهم منخفضة قدر الإمكان

7. المستخدمون بكلمات مرور غير منتهية الصلاحية

نظرًا للراحة في الغالب ، تمتلك بعض المؤسسات حسابات مجال تم تكوينها باستخدام مجموعة علامات DONT_EXPIRE_PASSWORD.

يعد هذا تكوينًا نموذجيًا لحسابات الخدمة ، ولكن يمكن أيضًا رؤيته في بعض الأحيان في حسابات المجال الأكثر امتيازًا.

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

تعد حسابات النطاق ذات الامتيازات العالية مع كلمات مرور غير منتهية الصلاحية أهدافًا مثالية لهجمات تصعيد الامتيازات وهي شائعة & # 8220backdoor & # 8221 المستخدمين للحفاظ على الوصول ، على سبيل المثال بواسطة مجموعات APT.

كيف تختبر

من أجل العثور على مستخدمين بكلمات مرور غير منتهية الصلاحية ، يمكننا استخدام أداة LDAPDomainDump المذكورة سابقًا مرة أخرى. كل ما نحتاجه هو بيانات اعتماد مستخدم مجال ذات امتيازات منخفضة والقدرة على الوصول إلى منفذ LDAP لأي وحدة تحكم بالمجال.

1) قم أولاً بجمع المعلومات من وحدة تحكم المجال:

2) بمجرد الانتهاء من الإغراق ، يمكننا الحصول على قائمة المستخدمين بكلمات مرور غير منتهية الصلاحية باستخدام الأمر التالي:

بدلاً من ذلك ، يمكن استخدام أمر PowerShell التالي على وحدة تحكم المجال للحصول على قائمة بهؤلاء المستخدمين:

8. المستخدمون بكلمة مرور غير مطلوب

علامة أخرى مثيرة للاهتمام في Active Directory هي علامة PASSWD_NOTREQD. إذا كان حساب المستخدم لديه مجموعة العلامات هذه ، فهذا يعني أن الحساب ليس لديه كلمة مرور & # 8217t.

هذا لا يعني & # 8217t أن حساب المستخدم لا يحتوي & # 8217t على كلمة مرور ، فهذا يعني ببساطة أنه لا يجب أن يكون لديه كلمة مرور & # 8217t. هذا يعني أن أي نوع من كلمات المرور سيكون على ما يرام & # 8211 كلمة مرور قصيرة ، أو كلمة مرور غير متوافقة (ضد سياسة كلمة مرور المجال) ، أو كلمة مرور فارغة. ببساطة أي.

هذا بالطبع يمثل مخاطرة أمنية كبيرة ولا يجب أن يحتوي أي حساب مستخدم على مجموعة العلامات هذه.

كيف تختبر

إن البحث عن مستخدمين باستخدام مجموعة إشارات PASSWD_NOTREQD مشابه جدًا للبحث عن مستخدمين بكلمات مرور غير منتهية الصلاحية. يمكننا الاستفادة مرة أخرى من أداة LDAPDomainDump.

كل ما نحتاجه هو بيانات اعتماد مستخدم مجال ذات امتيازات منخفضة والقدرة على الوصول إلى منفذ LDAP لأي وحدة تحكم بالمجال.

1) قم أولاً بجمع المعلومات من وحدة تحكم المجال:

2) بمجرد الانتهاء من التفريغ ، احصل على قائمة المستخدمين بعلامة PASSWD_NOTREQD باستخدام الأمر التالي:

بدلاً من ذلك ، يمكن استخدام أمر PowerShell التالي على وحدة تحكم المجال للحصول على قائمة المستخدمين الذين لديهم كلمة مرور غير مطلوبة:

9. تخزين كلمات المرور باستخدام التشفير العكسي

تتطلب بعض التطبيقات كلمة مرور المستخدم & # 8217s بنص عادي من أجل إجراء المصادقة وهذا هو سبب وجود دعم لتخزين كلمات المرور باستخدام التشفير القابل للعكس في Active Directory.

يتطابق تخزين كلمات المرور بهذه الطريقة بشكل أساسي مع تخزينها في نص عادي. إنها فكرة مروعة ، لكنها حقيقة واقعة.

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

  • حقوق إجراء عملية DCSYNC (على سبيل المثال عبر Mimikatz)
  • الوصول إلى ملف NTDS.DIT ​​على وحدة تحكم المجال

كيف تختبر

تشير كلتا الطريقتين إلى وجود تسوية كاملة لمجال AD بالفعل ، لذا فهي ليست كارثة في الواقع.

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

لذلك ، من أجل اختبار هذه الثغرة الأمنية ، يتعين علينا تفريغ ملف NDTS.DIT ​​من وحدة تحكم المجال واستخراج التجزئة منه. عندها فقط يمكننا معرفة المستخدمين الذين لديهم كلمات مرور مخزنة باستخدام تشفير عكسي & # 8211 ستتم طباعة كلمات المرور الخاصة بهم ببساطة بنص عادي.

لاحظ أنه يمكننا أيضًا الحصول على كلمة مرور النص العادي باستخدام Mimikatz الذي يعمل في سياق مستخدم ذي امتيازات عالية (قادر على أداء DCSYNC) ، ولكن علينا معرفة اسم المستخدم للمستخدم المتأثر.

هنا & # 8217s أمر Mimikatz الذي من شأنه أن يفعل ذلك:

في أي حال ، لا ينبغي أبدًا تخزين كلمات المرور في نص عادي. تمنح هذه الثغرة الأمنية المهاجمين الذين قاموا باختراق مجال AD (مثل APTs) والمطلعين ذوي الامتيازات العالية (مثل مسؤولي المجال) وصولاً فوريًا إلى كلمات مرور النص العادي للمستخدمين المتأثرين.

10. تخزين كلمات المرور باستخدام تجزئات LM

هناك ثغرة أخرى تظهر عادةً بعد اختراق Active Directory وهي تخزين كلمات المرور كتجزئة LM ، بدلاً من NTLM.

تجزئة LM هي طريقة قديمة مهملة لتخزين كلمات المرور التي بها نقاط الضعف التالية:

  • طول كلمة المرور محدد بـ 14 حرفًا
  • يتم تقسيم كلمات المرور التي يزيد طولها عن 7 أحرف إلى قسمين ويتم تجزئة كل نصف بشكل منفصل
  • يتم تحويل جميع الأحرف الصغيرة إلى أحرف كبيرة قبل التجزئة

نظرًا لنقاط الضعف هذه ، من السهل للغاية كسر تجزئة LM. أي شخص لديه حق الوصول إليها ، على سبيل المثال يمكن للمطلعين ذوي الامتيازات العالية (مسؤولي المجال) كسرهم بسهولة والحصول على كلمات مرور نصية عادية.

كيف تختبر

كما أشرنا أعلاه ، يتم الكشف عن هذه المشكلة عادةً بعد اختراق AD واستخراج ملفات NTDS.DIT.

هنا & # 8217s تجديد سريع لتجزئة LM و NTLM:

عندما يتم تعيين الجزء LM على شيء آخر بخلاف & # 8216aad3b435b51404eeaad3b435b51404ee & # 8217 (سلسلة فارغة) ، فهذا يعني أننا نبحث عن تجزئة LM.

إذن ، هنا & # 8217s كيف يمكننا تحديد تجزئات LM:

11. حسابات الخدمة عرضة لتحميص AS-REP

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

ببساطة ، فإنه يؤثر على مستخدمي المجال مع مجموعة علامات DONT_REQ_PREAUTH.

هنا & # 8217s مقال تفصيلي حول تحميص AS-REP:

كيف تختبر

على غرار Kerberoasting ، تمت أتمتة هذا الهجوم بواسطة أدوات متعددة (مثل Impacket أو Rubeus). لكن هناك بعض الفروق الدقيقة ..

من أجل اختبار تحميص AS-REP ، ليس علينا معرفة أي بيانات اعتماد لمستخدم المجال! الشيء الوحيد الذي نحتاج إلى معرفته هو المستخدمين المتأثرين.

إذا كنا لا نعرف أيًا من & # 8217t ، حسنًا ، يمكننا تجربة قائمة كلمات بأسماء مستخدمين كما في هذا المثال باستخدام Impacket:

من ناحية أخرى ، إذا كان لدينا أي بيانات اعتماد لمستخدم المجال ذي الامتيازات المنخفضة ، فيمكننا الحصول على قائمة المستخدمين المتأثرين على الفور ، جنبًا إلى جنب مع تجزئات Kerberos AS-REP الخاصة بهم. هنا & # 8217s كيفية القيام بذلك:

إذا حصلنا على بعض علامات التجزئة ، فلدينا شيء نبلغ عنه ويمكننا محاولة كسره.

هنا & # 8217s مثال مع Hashcat باستخدام هجوم القاموس لاختراق تجزئات Kerberos AS-REP:

بدلاً من ذلك ، يمكن استخدام أمر PowerShell التالي على وحدة تحكم المجال للحصول على قائمة المستخدمين الذين لا يحتاجون إلى مصادقة Kerberos المسبقة:

12. ضعف سياسة كلمة مرور المجال

سياسة كلمة المرور هي موضوع يستمر في التطور بمرور الوقت. هناك العديد من وجهات النظر المختلفة والآراء حول الشكل الذي يجب أن تبدو عليه سياسة كلمة المرور المثالية.

تفرض بعض المؤسسات كلمات مرور طويلة ومعقدة ، وتقوم بتغييرها بشكل متكرر. البعض أكثر إحسانًا ويمكن للبعض أن يتجاهل تقريبًا فرض معلمات كلمة مرور قوية تمامًا والتركيز فقط على تعزيز ضوابطهم التعويضية في بيئاتهم الداخلية ، بشكل كلي ، بحيث يكون لتسوية الحساب تأثير ضئيل للغاية.

من المؤكد أن لكل نهج مزاياه وعيوبه ، ولكن بصفتنا مختبري اختراق ، يجب أن نلتزم بشيء حكيم ومقبول بشكل عام ، على الرغم من أن العملاء قد يقومون في النهاية بإجراء مكالمتهم الخاصة.

على سبيل المثال ، يوصي CIS Benchmark بسياسة كلمة مرور Active Directory التالية:

  • الحد الأدنى لطول كلمة المرور: 14
  • فرض محفوظات كلمة المرور: 24
  • الحد الأقصى لعمر كلمة المرور: 60 يومًا أو أقل
  • الحد الأدنى لعمر كلمة المرور: 1 أو أكثر
  • يجب أن تتوافق كلمة المرور مع التعقيد: ممكّن
  • تخزين كلمات المرور باستخدام تشفير عكسي: معطل
  • حد تأمين الحساب: ما يصل إلى 10 ، ولكن ليس 0
  • مدة إغلاق الحساب (بالدقائق): 15 دقيقة أو أكثر
  • نافذة مراقبة إغلاق الحساب (بالدقائق): 30 دقيقة

كيف تختبر

من أجل تعداد سياسة كلمة المرور ، لا نحتاج إلى أي امتيازات خاصة ويمكن لأي حساب نطاق ذي امتيازات منخفضة القيام بذلك.

إليك كيفية عرض سياسة كلمة مرور AD من جهاز يعمل بنظام Windows منضم إلى مجال:

إليك كيفية عرض سياسة كلمة مرور AD من Linux (مثل Kali Linux) باستخدام الأمر "polenum":

بدلاً من ذلك ، يمكننا أيضًا استخدام الأداة المساعدة & # 8216enum4linux & # 8217:

13. حسابات المجال غير النشطة

تتعلق مشكلة عدم الحصانة هذه بوجود حسابات مستخدمين نشطة دون استخدامها لفترة طويلة ، وفقًا لـ & # 8216 تاريخ تسجيل الدخول الأخير & # 8217. تنتمي هذه الحسابات عادةً إلى:

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

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

كيف تختبر

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

كل ما نحتاجه هو بيانات اعتماد مستخدم مجال ذات امتيازات منخفضة والقدرة على الوصول إلى منفذ LDAP لأي وحدة تحكم بالمجال. إليك & # 8217s ما يجب فعله:

1) قم أولاً بجمع المعلومات من وحدة تحكم المجال:

2) بمجرد الانتهاء من الإغراق ، قم بفرز المستخدمين بناءً على تاريخ تسجيل الدخول الأخير الخاص بهم باستخدام الأمر التالي:

إذا رأينا شيئًا من هذا القبيل (FYI it & # 8217s عام 2020 وقت كتابة هذا التقرير) ، فيجب علينا إبلاغ العميل.

14. المستخدمون المتميزون الذين فات موعد إعادة تعيين كلمة المرور

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

من المحتمل أن تكون الحسابات المميزة أهدافًا للمهاجمين (مثل APTs) وإذا لم يتم تغيير كلمات المرور الخاصة بهم بشكل دوري ، فهذا يمنح المهاجمين وقتًا كافيًا لفرض بيانات اعتمادهم بنجاح.

كما ذكرنا سابقًا ، يجب تغيير كلمات المرور الخاصة بكل حسابات الخدمة والحسابات المميزة بشكل منتظم.

كيف تختبر

كيف تحدد بالضبط المستخدم المتميز؟ أحد المؤشرات الجيدة جدًا هو سمة AdminCount التي ذكرناها سابقًا. لذلك ، كل ما علينا فعله هو الحصول على قائمة بهؤلاء المستخدمين ومعرفة متى كانت آخر مرة تم فيها تغيير كلمة المرور الخاصة بهم.

يبدو الأمر معقدًا بعض الشيء ، ولكن مع أداة LDAPDomainDump المذكورة سابقًا ، فإنها & # 8217s قطعة من الكعكة. كل ما نحتاجه هو بيانات اعتماد أي مستخدم مجال ذي امتيازات منخفضة والقدرة على الوصول إلى منفذ LDAP لأي وحدة تحكم بالمجال.

1) قم أولاً بجمع المعلومات من وحدة تحكم المجال:

2) بمجرد الانتهاء من التفريغ ، احصل على قائمة المستخدمين مع تعيين سمة AdminCount على 1 عن طريق تحليل ملف & # 8216domain_users.json & # 8217:

3) كرر الآن من خلال قائمة المستخدمين المتميزين ، واعرض تاريخ إعادة تعيين كلمة المرور الأخيرة (pwdLastSet) وفرزها:

يبدو أن هؤلاء المستخدمين الخمسة المتميزين & # 8217t لديهم تغيير في كلمة المرور لفترة طويلة.

15. المستخدمون بكلمة مرور ضعيفة

على الرغم من وجود سياسة كلمة مرور قوية للشركة وبيئة ناضجة ، فلا يزال من الممكن وجود حسابات مجال بكلمات مرور ضعيفة.

في الواقع ، هذه مشكلة شائعة جدًا ، خاصة في بيئات Active Directory الكبيرة.

كيف تختبر

من أجل اختبار مستخدمي المجال لضعف بيانات الاعتماد ، يجب أن يكون لدينا قائمة بالمستخدمين أولاً. ومن أجل الحصول على القائمة ، يجب أن يكون لدينا وصول مستخدم ذي امتيازات منخفضة إلى المجال.

هنا & # 8217s ما يمكننا القيام به على جهاز Windows انضم إلى مجال:

1) نحتاج أولاً إلى الحصول على قائمة المستخدمين من AD ولهذا يمكننا استخدام مجموعة PowerShell التالية:

2) الآن يمكننا تغذية هذه القائمة في أي من الأدوات التالية للقيام بهجوم تسجيل الدخول:

بدلاً من ذلك ، يمكننا أيضًا استخدام bruteforcer (github) لتسجيل الدخول إلى AD في أضيق الحدود إذا كانت أيدينا مقيدة:

إليك كيف يمكننا فعل الشيء نفسه على Linux (مثل Kali Linux):

1) احصل على قائمة بمستخدمي مجال AD باستخدام الأمر "net":

2) يمكننا الآن إدخالها في أي من الأدوات المذكورة أعلاه ، على سبيل المثال إلى Metasploit للقيام بهجوم تسجيل الدخول:

تحذير: قبل تشغيل أي هجوم على تسجيل الدخول ، يجب أن نكون على دراية دائمًا بسياسة كلمة مرور الشركة لمنع عمليات تأمين المستخدم.

16. بيانات الاعتماد في SYSVOL وتفضيلات نهج المجموعة (GPP)

تتعلق مشكلة عدم الحصانة هذه بتخزين بيانات الاعتماد في مجلدات مشاركة شبكة SYSVOL ، وهي مجلدات على وحدات تحكم المجال التي يمكن الوصول إليها وقراءتها لجميع مستخدمي المجال المصادق عليهم.

تُستخدم مجلدات SYSVOL عادةً لتخزين نُهج مجموعة الشركة وملفات التكوين والبيانات الأخرى التي يتم دفعها إلى المستخدمين عند تسجيل الدخول وما إلى ذلك.

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

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

  • تفضيلات نهج المجموعة (GPP) مع سمة cPassword (MS14-025)
  • بيانات الاعتماد المشفرة في العديد من البرامج النصية وملفات التكوين

كيف تختبر

من أجل اختبار ذلك ، نحتاج إلى امتلاك أي بيانات اعتماد لمستخدم المجال ذي الامتيازات المنخفضة.

إليك ما يمكن أن نفعله من جهاز Windows انضم إلى مجال:

سيقوم هذا الأمر بفحص جميع الملفات الموجودة على وحدة تخزين SYSVOL والبحث عن & # 8220password & # 8221 pattern.

الأمر المكافئ في Linux (مثل Kali Linux) سيكون:

من المحتمل أننا سنجد شيئًا مثيرًا للاهتمام.

على سبيل المثال ، يمكننا العثور على سمة cPassword في ملفات GPP XML ، والتي يمكننا فك تشفيرها على الفور باستخدام الأداة المساعدة & # 8216gpp-decrypt & # 8217:

يمكننا الآن محاولة استخدام كلمة المرور هذه والمصادقة معها على أجهزة Windows الموجودة على الشبكة. أو يمكننا تجربتها في مكان آخر. من المحتمل أن يتم إعادة استخدام كلمة المرور في مكان ما (راجع أهم 10 نقاط ضعف تم العثور عليها أثناء اختبارات اختراق البنية التحتية الداخلية).


شكر وتقدير¶

تعتمد هذه الوحدة على إصدار سابق ، GPG.py ، كتبه أندرو كوتشلينج. تم تحسين هذا من قبل ريتشارد جونز ، ثم ستيف تراوجوت. تم اشتقاق وحدة gnupg من وحدة Steve Traugott & # 8217s ، وتستخدم وحدة المعالجة الفرعية Python & # 8217s للتواصل مع ملف GnuPG القابل للتنفيذ ، والذي تستخدمه لإنشاء عملية فرعية للقيام بالعمل الحقيقي.

لقد أدرجت بامتنان التحسينات التي ساهمت بها أو اقترحتها:

  • Paul Cunnane (دعم توقيع منفصل)
  • دانيال فولكينشتين (recv_keys ، التعامل مع المفاتيح الفرعية و SIGEXPIRED ، KEYEXPIRED أثناء التحقق ، EXPKEYSIG ، REVKEYSIG)
  • ديمتري جلادكوف (التعامل مع KEYEXPIRED عند الاستيراد)
  • عبد الكريم (رقعة كيرينغ)
  • Yann Leboulanger (تعامل مع ERRSIG و NO_PUBKEY أثناء التحقق ، احصل على مفاتيح فرعية)
  • كيريل ياكوفينكو (دعم RSA و IDEA)
  • روبرت ليفتويتش (مقبض INV_SGNR ، KEY_NOT_CREATED)
  • ميشال نيكلاس (مستويات الثقة للتحقق من صحة التوقيع)
  • ديفيد نويل (search_keys، send_keys function)
  • David Andersen (التعامل مع UNEXPECTED أثناء التحقق)
  • جانيس لايدل (توقيع الإخراج إلى ملف)
  • Venzen Khaosan (وظيفة scan_keys)
  • مارسيل بورنر (المقبض EXPORTED، EXPORT_RES)
  • Kévin Bernard-Allies (التعامل مع ترميز اسم الملف تحت Windows)

ومستخدمي Google Code / BitBucket

  • dprovins (ListKeys handle_status)
  • ernest0x (دعم محسّن للمدخلات بخلاف ASCII)
  • eyepulp (خيارات إضافية للتشفير / فك التشفير)
  • hysterix.is.slackin (دعم التشفير المتماثل)
  • natureshadow (تحسين معالجة الحالة عند استخدام البطاقات الذكية)
  • SunDwarf (تخزين التوقيعات مقابل المفاتيح)

(إذا فاتني & # 8217ve أي شخص من هذه القائمة ، فيرجى إبلاغي بذلك.)


3.9.1 (2021-05-14)

3.9.0 (2021-02-26)

  • تمت إزالة رمز التوافق لإصدارات Python غير المدعومة
  • تم إسقاط دعم Python 3.4 القديم
  • معالجة مساحة الاسم الثابتة عند إعادة تعريف متغير في نفسه تل: تعريف (#237)
  • إصلاح الفشل في حساب ملخص النموذج إذا template.filename لا يوجد (# 254)

3.8.1 (2020-07-06)

  • تمت إضافة تحسين الكود لتقليل الملحقات المتسلسلة للنص الثابت.
  • أصبح الرمز الافتراضي في السمات الديناميكية الآن رمزًا. في السابق ، تم تعيين قيمة السلسلة لنص السمة الافتراضية. تم إجراء تغيير مماثل لتعبيرات التبديل / الحالة.
  • يعمل قاموس Attrs المدمج لسمات العناصر الثابتة الآن بشكل صحيح مع tal: تحديد ، إلخ.
  • إصلاح مشكلة توافق إنشاء كود الشريحة على Python 3.9.

3.8.0 (2020-06-25)

  • كشف العلامة الافتراضية كرمز قابل للاستيراد chameleon.tales.DEFAULT_MARKER.
  • تمت إزالة العلامة القديمة literal_false. للحصول على سلوك مشابه ، استخدم boolean_attributes.

3.7.4 (2020-06-17)

3.7.3 (2020-06-17)

  • إصلاح الانحدار المقدم في 3.6.2 حيث تقوم العلامة الافتراضية بتغيير قيمتها بشكل غير صحيح بين القوالب ، مما يتسبب في حدوث مشكلات في البرنامج والتي تعتمد على القيمة التي يتم التعامل معها ككائن عام.

3.7.2 (2020-05-31)

  • السماح بتعيين وظيفة تمثيل قيمة مخصصة ، مما يسمح بتنسيق مخصص للمتغيرات أثناء تنسيق الاستثناء.

3.7.1 (2020-05-10)

3.7.0 (2020-03-26)

  • تم إصلاح مشكلة جمع البيانات المهملة مع كائنات النطاق المتغير (المشكلة رقم 301).
  • تم حل مشكلة عدم توفر إعداد متغير عام محليًا.
  • لم يعد RepeatDict يرث من الإملاء لأنه لا يوفر هذه الواجهة فعليًا بطريقة مفيدة.
  • تمت إضافة بوابة الميزة enable_comment_interpolation والتي تتحكم في تمكين استيفاء التعبير داخل تعليقات HTML (يتم تمكين الإعداد الافتراضي).
  • تمت إضافة دعم لـ Python 3.6+ f-strings (الإصدار رقم 294).

3.6.2 (2019-06-22)

3.6.1 (2019-04-01)

3.6 (2019-02-19)

استبعد RuntimeError (أو RecursionError عند توفره) من التفاف الاستثناءات.

إصلاح الهروب من الدولار المزدوج "$" بحيث يتم دائمًا حل الدولار المزدوج ، إما كتعبير استيفاء ، أو كمهرب حيث يتم استبداله برمز دولار واحد. هذا يتوافق الآن مع طريقة تعامل Zope مع هذه الشخصية.

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

هذا يعمل على إصلاح المشكلة رقم 283. لاحظ أن هذا يعكس بعض التغييرات التي تم إدخالها لإصلاح المشكلة رقم 265.

إسقاط دعم Python 3.3.

3.5 (2018-10-17)

  • أضف دعمًا لـ Python 3.8.
  • أضف دعمًا لسمات TAL في علامة إعلان XML. يعمل هذا على إصلاح المشكلة رقم 269.
  • أضف دعمًا لمعالجة الاستثناءات المخصصة لبيان tal: on-error. يوجد الآن خيار on_error_handler متاح كتكوين قالب (المشكلة رقم 266).
  • إصلاح المشكلة حيث قد يؤثر الهروب المزدوج "$" على التعبيرات غير الداخلية مثل "$" العاري (المشكلة رقم 265).
  • إصلاح مشكلة حيث يؤدي هروب الشرطة المائلة للخلف إلى ترك حرف الخط المائل العكسي في مكانه.

3.4 (2018-07-14)

3.3 (2018-05-23)

  • إعادة تعيين رمز الخطأ المميز عند تقديم استدعاءات الماكرو الداخلية.
  • إصلاح حالة الحافة في معالج الاستثناء الذي يسبب العودية. [ماثيو ويلكس]

3.2 (2017-10-06)

  • أضف المتغير التلقائي مكرونامي يرتبط باسم تنفيذ الماكرو. إصلاحات https://github.com/malthe/chameleon/issues/238
  • يمكن الآن تكوين رمز مميز في فئة القالب. يكون هذا مفيدًا في حالة تعديل إدخال ملف القالب قبل التحليل (على سبيل المثال ، حيث يتم تجريد بعض العلامات) بحيث يلزم تعويض مواضع الرمز وفقًا لذلك حتى يتم عرض مواقع الخطأ بشكل صحيح.
  • تعرض أخطاء التعبير الآن علامة المصدر (تم عرض اسم الملف والخط والعمود فقط في السابق).
  • لم تعد تتطلب ملفات مصدر Python لاستيراد الوحدات. [mrh1997]

3.1 (2017-02-21)

  • إضافة خيار مقيدة التي تتحكم في ما إذا كان سيتم تقييد مساحات الأسماء لتلك المعرفة والمستخدمة بواسطة لغة قالب الصفحة. [هنصروه]
  • تبسيط تتبع الاستثناءات ، وتقليل حجم الرمز الثانوي بشكل ملحوظ.
  • تجنب التحقق مما إذا كانت السلسلة الثابتة لا أحد أثناء الاستيفاء التعبير.

3.0 (2016-12-07)

  • إصلاح المشكلة في Python 2 حيث لم يتم مسح استثناء عند استخدام مشغل الأنابيب وبالتالي يمكن الوصول إليه من خلال sys.exc_info ().
  • لم يعد التعبير "موجود" يؤدي إلى تسرب معلومات الخطأ.
  • يمكنك الهروب من "$" إلى "$" في كل من تعبيرات المحتوى والسلسلة.
  • إصلاح استخدام تعريف الماكرو داخل كتلة الترجمة.
  • السماح بقيم السمات غير المسعرة.
  • تم طرح خطأ سمة الالتفاف عند محاولة استخدام ماكرو غير ماكرو كخطأ RenderError للحصول على ناتج خطأ مناسب.
  • ألق خطأ تحليل إذا ظهرت "-" (واصلة مزدوجة) في تعليق XML.
  • تتجاوز السمة i18n: target الآن متغير target_language الافتراضي ويتم تمريرها إلى وظيفة الترجمة.
  • قم بتضمين اسم الملف في اسم وحدة التخزين المؤقت على القرص. في السابق ، كان يتم استخدام ملخص SHA فقط في التمثيل السداسي ، مما يجعل من الصعب معرفة مصدر الوحدة. يعمل هذا على إصلاح المشكلة رقم 132.
  • أضف دعمًا لأسماء سمات non-ascii. [غرقت]

2.25 (2016-09-24)

  • إضافة دعم / اختبار صريح لـ Python 3.5.
  • يضيف r إلى المطابقات التعبيرية السلبية لمحلل الحرباء ، حيث ن يستخدم ولكن r كان مفقود. يعمل على إصلاح حالة ، حيث تم تحليل اسم العلامة فيها أتش تي أم أل r بدلا من لغة البرمجة. الإصلاحات: https://github.com/malthe/chameleon/issues/219

2.24 (2015-10-28)

2.23 (2015-10-26)

  • مضاف تمكين_السمات_البيانات الخيار الذي يسمح باستخدام سمات بيانات HTML5 كسمات تحكم بدلاً من ذلك أو بالإضافة إلى سمات مساحة اسم XML.

2.22 (2015-02-06)

2.21 (2015-02-06)

  • مضاف خطأ في التقديم استثناء يشير إلى حدوث خطأ أثناء تقييم تعبير.
  • نظف TemplateError. خطأ تنفيذ الاستثناء.

2.20 (2015-01-12)

  • يمر search_path إلى فئة القالب عند تحميلها باستخدام TemplateLoader (أو أحد الفئات المشتقة). [فاسن]

2.19 (2015-01-06)

2.18 (2014-11-03)

2.17 (2014-11-03)

  • أضف دعمًا لـ i18n: السياق. [شعر مستعار]
  • أضف خاصية التكرار "parity" المفقودة. [voxspox]
  • لا تعدل البيئة عند الحصول على متغيرات منها. [fschulze]

2.16 (2014-05-06)

إذا تم تقييم التعبير المكرر إلى لا أحد إذن فهو الآن معادل لمجموعة فارغة.

هذا يغير السلوك المقدم في 2.14.

إزالة الاعتماد على اختبار الأحفوري في الإهمال نشر.

إضافة دعم / اختبار صريح لـ Python 3.3 / 3.4.

قم بإسقاط الدعم الصريح لـ Python 2.5 (خارج الصيانة ، ولم يعد مدعومًا بواسطة سم أو ترافيس- CI ).

2.15 (2014-03-11)

2.14 (2013-11-28)

  • تكرار العنصر باستخدام TAL لم تعد مساحة الاسم تتضمن مسافة بيضاء. يعمل هذا على إصلاح المشكلة رقم 110.
  • استخدم الاستيراد المطلق لـ الحرباء. واجهات وحدة. يعمل هذا على إصلاح المشكلة رقم 161.

2.13-1 (2013-10-24)

2.13 (2013-10-21)

  • تتضمن آلية ذاكرة التخزين المؤقت للقالب الآن إعدادات تكوين إضافية كجزء من مفتاح التخزين المؤقت مثل حازم و تقليم_تخصيص_مسافة. [أوسمكيتي]
  • إصلاح مشكلة ذاكرة التخزين المؤقت حيث لا يتم تحميل القوالب المخزنة مؤقتًا بشكل صحيح في بعض الأحيان. [أوسمكيتي]
  • في وضع التصحيح ، قم بإزالة الملفات المؤقتة بشكل صحيح عندما يتم تجميع محمل الوحدة النمطية (on __del__). [الجاذبية]
  • إصلاح رسالة الخطأ عند تكرار i18n: يتم استخدام توجيهات الاسم في الترجمة.
  • باستخدام صيغة الثلاث وسيطات getattr على الحرباء لم يعد يثير KeyError، والسماح للافتراضي المقدم إلى getattr يستخدم. يعمل هذا على إصلاح محاولة تكييف ملف كرر ديكت إلى واجهة Zope تحت PyPy.

2.12 (2013-03-26)

  • تقوم الترجمة الضمنية الآن باستخلاص وتطبيع الجمل الكاملة بشكل صحيح ، بدلاً من الكلمات. [يتش]
  • ال إفتراضي رمز في tal: حالة الشرط الآن يسمح للعنصر فقط إذا لم تنجح أي حالة أخرى.

2.11 (2012-11-15)

  • تم حل مشكلة حيث تم دمج عبارة METAL مع ملف tal: على الخطأ معالج.
  • إصلاح مشكلة المحلل اللغوي البسيطة بإرشادات المعالجة المنسقة بشكل غير صحيح.
  • توفير معالجة مناسبة للأخطاء لمجموعات التعليمات البرمجية المضمنة في Python

2.10 (2012-10-12)

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

الدافع هو أنه منذ الإصدار 2.9 ، كان سياق الكلام الحجة غير تافهة: econtext تم تمرير الخرائط. هذا يكسر التوقعات على منصة Zope بأن سياق الكلام المعلمة هي طلب HTTP. في السابق ، مع Chameleon ، لم يتم توفير هذه المعلمة ببساطة وبالتالي لم يتسبب ذلك في حدوث مشكلات على هذا النحو.

ال ast24 تمت إعادة تسمية الوحدة النمطية إلى ast25. يجب أن يساعد هذا في توضيح أي ارتباك بأن Chameleon 2.x قد تدعم مترجم Python أقل من الإصدار 2.5 (لا يفعل ذلك).

ال ProxyExpr فئة التعبير (ومن ثم حمل: نوع التعبير) هو الآن تعبير TALES. من الناحية العملية ، هذا يعني أن نوع التعبير (الذي يحسب نتيجة سلسلة باستخدام المعيار "$<. >" يدعم بناء جملة الاستيفاء والوكلاء النتيجة من خلال دالة) الآن احتياطيًا باستخدام مشغل الأنابيب ("|"). يعمل هذا على إصلاح المشكلة رقم 128.

محاولة إقحام باستخدام السلسلة الفارغة كتعبير (أي $<>) الآن لا يفعل شيئًا: السلسلة $<> هو مجرد إخراج كما هو.

تمت إضافة دعم لإضافة السمات وتعديلها وإزالتها باستخدام تعبير القاموس بتنسيق التل: الصفات (على غرار جينشي الحمر: attrs التوجيه):

في المثال أعلاه ، اسم هو معرف ، بينما القيمة و أترس هي تعبيرات بايثون. ومع ذلك، أترس يجب أن يتم تقييمه إلى كائن قاموس Python (بشكل أكثر إيجازًا ، يجب أن تنفذ القيمة أساليب قاموس API تحديث() و العناصر()).

  • من أجل تقليل حجم كائنات الوظيفة المترجمة ، تم وضع بعض عبارات التحويل والاقتباس في الوظائف. في قياس واحد ، كان التخفيض 35٪. جناح المعيار يفعل ليس تقرير عن زيادة وقت العرض (انخفض قليلاً في الواقع).
  • يظهر استثناء الآن إذا تم تمرير سلسلة تافهة لـ المعدن: فتحة ملء . يعمل هذا على إصلاح المشكلة رقم 89.
  • الآن لم تتم ترجمة سلسلة فارغة. ليس خطأ حقًا ، ولكن تم الإبلاغ عنه كمشكلة (# 92) لأن بعض أطر الترجمة تتعامل مع هذه الحالة بشكل غير صحيح.
  • تقوم أداة تحميل وحدة القالب (ذاكرة التخزين المؤقت للملف) الآن بترميز شفرة مصدر القالب التي تم إنشاؤها بشكل صحيح كـ UTF-8. يعمل هذا على إصلاح المشكلة رقم 125.
  • تم إصلاح المشكلة حيث يمكن إعادة استخدام الإغلاق بشكل غير آمن في عرض القالب المتداخل.
  • فئة الترميز الثابتة __إعداد__ طريقة. يعمل هذا على إصلاح المشكلة رقم 124.
  • تمت إضافة عبارة إرجاع مفقودة لإصلاح طباعة اسم الملف غير المختصر في حالة وجود استثناء. [تومو]

2.9.2 (2012-06-06)

  • تم إصلاح عدم توافق PyPy.
  • تم إصلاح المشكلة رقم 109 التي تسببت في فشل الاختبار على بعض الأنظمة الأساسية.

2.9.1 (2012-06-01)

  • تم حل المشكلة رقم 103. ال tal: على الخطأ تضيف العبارة الآن دائمًا علامة نهاية صريحة إلى العنصر ، حتى مع وجود محتوى بديل لا شيء.
  • تم حل المشكلة رقم 113. ال tal: على الخطأ البيان يعمل الآن بشكل صحيح أيضًا للسمات الديناميكية. أي أن العلامة الاحتياطية تتضمن الآن سمات ثابتة فقط.
  • تم إصلاح خطأ الاسم الذي منع المعيار من العمل بشكل صحيح.
  • تم إصلاح تحذير الإهمال في Python 3 لواجهة zope التي تنفذ الإعلان. يعمل هذا على إصلاح المشكلة رقم 116.

2.9.0 (2012-05-31)

  • تحصل وظيفة الترجمة الآن على الامتداد econtext حجة كقيمة ل سياق الكلام. لاحظ أنه من الناحية التاريخية ، كان هذا عادةً طلب HTTP والذي قد يوفر بيانات تفاوض اللغة من خلال واجهة القاموس. [ألفينيوي]
  • تم إصلاح مشكلة الاسم المستعار للاستيراد والتي قد تؤدي إلى خطأ في بناء الجملة في كود Python الذي تم إنشاؤه. إصلاحات المشكلة رقم 114.

2.8.5 (2012-05-02)

  • تم إصلاح مشكلات التثبيت البسيطة في Python 2.5 و 3. [ppaez]
  • تأكد من أن المخرجات هي unicode حتى عندما تكون تافهة (سلسلة فارغة).

2.8.4 (2012-04-18)

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

2.8.3 (2012-04-16)

  • سجل مصدر القالب على مستوى التصحيح قبل الطهي.
  • إن الوسيطة target_language متاحة الآن كمتغير في القوالب ، إذا تم تقديمها.

2.8.2 (2012-03-30)

  • يتم تنظيف ذاكرات التخزين المؤقت المؤقتة المستخدمة في وضع التصحيح بلهفة ، بدلاً من انتظار إنهاء العملية. [ميتشلرج]
  • أساليب الفهرس والبدء والنهاية على كائن تكرار TAL قابلة للاستدعاء الآن. يعمل هذا على إصلاح عدم التوافق مع ZPT.
  • يقوم المُحمل الآن بمعالجة المسارات المطلقة بشكل صحيح على Windows. [rdale]

2.8.1 (2012-03-29)

  • يسرد منسق الاستثناءات الآن الأخطاء في "ترتيب الالتفاف". هذا يعني أن الاستثناء الأعمق والأكثر صلة على الأرجح يظهر أخيرًا.
  • يتعرف منسق الاستثناء الآن بشكل صحيح على الأخطاء المتداخلة ولا يعيد تغليف فئة الاستثناء التي تم إنشاؤها ديناميكيًا.
  • يقوم منسق الاستثناء الآن بتعيين ملف __وحدة__ السمة إلى فئة الاستثناء الأصلية.

2.8.0 (2012-02-29)

تمت إضافة دعم لمجموعات التعليمات البرمجية باستخدام & lt؟ python…؟ & gt بنية تعليمات المعالجة.

النطاق هو تعيينات الاسم حتى أقرب تعريف ماكرو ، أو القالب نفسه إذا لم يتم استخدام وحدات الماكرو.

  • العودة إلى فئة الاستثناء __الجديد__ طريقة لإنشاء كائن استثناء بأمان لم يتم تنفيذه في Python.
  • يتتبع منسق الاستثناءات الآن الاستثناءات المنسقة بالفعل ويتجاهلها من الإخراج الإضافي.

2.7.4 (2012-02-27)

  • يقوم معالج الخطأ الآن باستدعاء ملف __فيه__ طريقة BaseException بدلاً من الطريقة التي يمكن تجاوزها (والتي قد تتطلب الحجج المطلوبة). يعمل هذا على إصلاح المشكلة رقم 97. [j23d، malthe]

2.7.3 (2012-01-16)

  • يعمل خيار المسافة البيضاء المقطوعة الآن بشكل صحيح على اقتطاع المسافة البيضاء الفعلية إلى حرف واحد ، ويظهر إما على يسار أو يمين بادئة عنصر أو سلسلة لاحقة.

2.7.2 (2012-01-08)

  • خيار مضاف تقليم_تخصيص_مسافة التي تقرر ما إذا كانت المسافة البيضاء للسمة قد تم تجريدها (على الأكثر إلى مسافة واحدة). يوجد هذا الخيار لتوفير التوافق مع تطبيق المرجع. يعمل على إصلاح المشكلة رقم 85.
  • تجاهل العناصر المضمنة غير القابلة للكسر عند إنشاء خريطة مضمنة عكسية للبحث بسرعة عن قيمة مضمنة. [مالث]
  • تطبيق تعيين الترجمة حتى في حالة عدم توفر وظيفة الترجمة. يعمل هذا على إصلاح المشكلة رقم 83. [مالث]
  • تم حل المشكلة رقم 80. يتم تحديد مجال الترجمة للفتحة من خلال المستند المصدر ، أي النموذج الذي يوفر محتوى الفتحة سواء كانت افتراضية أو مقدمة من خلال المعدن: فتحة ملء . [jcbrand]
  • في ظروف معينة ، قد يتسبب حرف مسافة غير منقسمة في Unicode في فشل تحليل جملة تعريف.

2.7.1 (2011-12-29)

تفعيل استيفاء التعبير في CDATA.

تطبق فئة قالب الصفحة الآن وصول القاموس إلى وحدات الماكرو:

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

2.7.0 (2011-12-13)

ال حمل: التعبير الآن مشتق من تعبير السلسلة مثل أن يمكن استخدام عامل التشغيل $ لاستيفاء التعبير.

ال حمل: يقبل التعبير الآن مواصفات الأصول التي يتم حلها بواسطة pkg_resources.resource_filename وظيفة:

مثال من مجموعة الاختبار:

  • إذا لم يكن اسم السمة للترجمة معرّف Python صالحًا ، فسيقوم المترجم بإنشاء رمز غير صالح. تم إصلاح هذا ، ويطرح المترجم الآن استثناءً إذا احتوت مواصفات السمة على فاصلة. (لاحظ أن الحرف الفاصل الصالح الوحيد هو الفاصلة المنقوطة ، عند تحديد سمات للترجمة عبر i18n: ترجمة بيان). هذا يعالج المشكلة رقم 76.

2.6.2 (2011-12-08)

  • المشكلة الثابتة حيث tal: على الخطأ لن تحترم tal: حذف علامة أو عناصر مساحة الاسم التي تم حذفها افتراضيًا (مثل & lttal: block / & gt).
  • المشكلة الثابتة حيث وحدات الماكرو السمة لن تكون متاحة في القوالب المستندة إلى الملفات بسبب التهيئة غير الصحيحة.
  • ال حاول باستثناء و حاول أخيرًا عُقد AST غير متوفرة في Python 3.3. هذه قد تم تسميتها ل يحاول. يعمل هذا على إصلاح المشكلة رقم 75.

يُصدر عنصر تكرار TAL الآن إعلانًا أمنيًا يمنح الوصول إلى الكائنات الفرعية غير المحمية على النظام الأساسي Zope 2:

هذا مطلوب للتوافق القديم ولا يؤثر على البيئات الأخرى.

كائن القالب له طريقة الآن الكتابة (الجسم) الذي يفك بشكل صريح ويطبخ إدخال سلسلة.

خيار التكوين المضافة فئة_محمل الذي يحدد الفئة المستخدمة لإنشاء كائن محمل القالب.

يتم إنشاء الفئة (القابلة للاستدعاء بشكل أساسي) في وقت إنشاء النموذج.

2.6.1 (2011-11-30)

  • فك ترميز كيانات HTML في سلاسل الاستيفاء للتعبير. يعمل هذا على إصلاح المشكلة رقم 74.
  • السماح xml و xmlns سمات على عناصر مساحة الاسم TAL و I18N و METAL. يعمل هذا على إصلاح المشكلة رقم 73.

2.6.0 (2011-11-24)

دعم إضافي للترجمة الضمنية:

ال ترجمة ضمنية يتيح الخيار الترجمة الضمنية للنص. ال السمات الضمنية تمكن الترجمة الضمنية للسمات. يجب أن تكون الأخيرة مجموعة ولكي يتم ترجمة السمة بشكل ضمني ، يجب تضمين قيمة سلسلة الأحرف الصغيرة في المجموعة.

خيار مضاف حازم (ممكّن افتراضيًا) والذي يقرر ما إذا كانت التعبيرات مطلوبة لتكون صالحة في وقت الترجمة. وهذا يعني ، إذا لم يتم تعيينه ، يظهر استثناء فقط لتعبير غير صالح في وقت التقييم.

ينتج عن خطأ التعبير الآن استثناء فقط إذا تمت محاولة تقييم التعبير أثناء العرض.

تمت إضافة خيار التكوين prepend_relative_search_path الذي يقرر ما إذا كان المسار المتعلق بقالب مستند إلى ملف مضغوط مسبقًا إلى مسار بحث التحميل. الافتراضي هو حقيقي.

تمت إضافة خيار التكوين search_path إلى فئة القالب المستند إلى الملف ، والتي تضيف مسارات إضافية إلى مثيل تحميل القالب المرتبط بامتداد حمل: التعبير. يأخذ الخيار مسار سلسلة أو مسارات سلسلة قابلة للتكرار. القيمة الافتراضية هي المجموعة الفارغة.


ادارة المفاتيح¶

توفر الوحدة وظائف لتوليد (إنشاء) المفاتيح ، وسرد المفاتيح ، وحذف المفاتيح ، واستيراد وتصدير المفاتيح.

توليد المفاتيح¶

أول شيء تريد فعله عادةً عند البدء بإطار عمل PKI هو إنشاء بعض المفاتيح. يمكنك القيام بذلك على النحو التالي:

حيث input_data عبارة عن سلسلة أوامر خاصة تخبر GnuPG بالمعلمات التي تريد استخدامها عند إنشاء المفتاح. لتسهيل الحياة ، يتم توفير طريقة مساعدة تأخذ وسيطات الكلمات الرئيسية التي تسمح لك بتحديد المعلمات الفردية للمفتاح ، كما في المثال التالي:

يتم توفير القيم الافتراضية المعقولة للمعلمات التي لم تحددها ، كما هو موضح في الجدول التالي:

معامل حجة الكلمات الرئيسية القيمة الافتراضية قيم المثال معنى المعلمة
نوع المفتاح نوع المفتاح "RSA" "RSA" ، "DSA" نوع المفتاح الأساسي المراد إنشاؤه. يجب أن تكون قادرة على التوقيع.
طول المفتاح طول المفتاح 1024 1024, 2048 طول المفتاح الأساسي بالبتات.
الاسم الحقيقي اسم_ريال "مفتاح مُنشأ تلقائيًا" "فريد بلوجز" الاسم الحقيقي لهوية المستخدم التي يمثلها المفتاح.
اسم التعليق name_comment "تم إنشاؤه بواسطة gnupg.py" "مستخدم تجريبي" تعليق لإرفاقه بمعرف المستخدم.
الاسم والبريد الإلكتروني الاسم_البريد الإلكتروني & ltusername & gt & # 64 & lthostname & gt "fred & # 46 bloggs & # 64 domain & # 46 com" عنوان بريد إلكتروني للمستخدم.

إذا لم تحدد أي معلمات ، فسيتم استخدام القيم الموجودة في الجدول أعلاه مع القيم الافتراضية المشار إليها. هناك مجموعة كاملة من المعلمات الأخرى التي يمكنك تحديدها ، راجع مستند GnuPG هذا لمزيد من التفاصيل. في حين أن استخدام مفاتيح RSA شائع (يمكن استخدامها للتوقيع والتشفير) ، هناك خيار شائع آخر وهو استخدام مفتاح DSA الأساسي (للتوقيع) مع مفتاح الجمل الثانوي (للتشفير). بالنسبة لهذا الخيار الأخير ، يمكنك توفير المعلمات الإضافية التالية:

معامل حجة الكلمات الرئيسية قيم المثال معنى المعلمة
نوع المفتاح الفرعي نوع المفتاح الفرعي "RSA" ، "ELG-E" نوع المفتاح الثانوي المراد إنشاؤه.
طول المفتاح الفرعي subkey_length 1024, 2048 طول المفتاح الثانوي بالبتات.
تاريخ انتهاء الصلاحية تاريخ انتهاء الصلاحية “2009-12-31”، “365d”، “3m”، “6w”، “5y”، “seconds = & ltepoch & gt”، 0 تاريخ انتهاء صلاحية المفتاح الأساسي وأي مفتاح ثانوي. يمكنك تحديد تاريخ ISO ، أو عدد الأيام / الأسابيع / الأشهر / السنوات ، أو قيمة الفترة ، أو 0 لمفتاح غير منتهي الصلاحية.
عبارة المرور عبارة المرور "سر" عبارة المرور المراد استخدامها. إذا لم يتم تحديد هذا المعامل ، فلن تكون هناك حاجة إلى عبارة مرور للوصول إلى المفتاح. لا يتم دعم عبارات المرور التي تستخدم الأسطر الجديدة. لاحظ أنه بالنسبة لإصدارات GnuPG & gt = 2.1 ، يجب توفير عبارة مرور ، ما لم يتم اتخاذ خطوات إضافية: راجع حجة no_protection أدناه.
٪لا حماية لا حماية خطأ (الافتراضي) ، صحيح إذا لم تكن هناك حاجة إلى عبارة مرور لمفتاح (والذي قد يكون الافتراضي للاختبارات ، على سبيل المثال) ، أو إذا كنت تريد استخدام سلسلة فارغة كعبارة مرور ، فيجب عليك تحديد True لهذه المعلمة. خلاف ذلك ، وإذا لم تستخدم Pinentry لإدخال عبارة مرور ، فلن يسمح GnuPG & gt = 2.1 بذلك. ليس من المنطقي تحديد True إذا تم تقديم عبارة مرور غير فارغة.

الجديد في الإصدار 0.4.7: تمت إضافة وسيطة الكلمة الأساسية no_protection.

مهما كانت وسيطات الكلمات الأساسية التي تمررها إلى gen_key_input () (بخلاف no_protection) ، فسيتم تحويلها إلى المعلمات التي يتوقعها GnuPG عن طريق استبدال الشرطات السفلية بواصلات وغلاف عنوان النتيجة. يمكنك بالطبع إنشاء المعلمات في معلمات القاموس الخاصة بك ثم تمريرها على النحو التالي:

سيتم استخدام وسيطة no_protection ، إذا كانت صحيحة ، لإنشاء سطر٪ no-Protection الذي يخبر GnuPG أنه لا توجد حماية بعبارة مرور مطلوبة.

مشاكل الأداء¶

يتطلب إنشاء المفتاح أن يعمل النظام مع مصدر أرقام عشوائية. يقال إن الأنظمة الأفضل في توليد أرقام عشوائية من غيرها لديها أعلى غير قادر علي. يتم الحصول على هذا عادةً من أجهزة النظام ، وتوصي وثائق GnuPG بإنشاء المفاتيح فقط على جهاز محلي (أي لا يتم الوصول إليه عبر شبكة) ، ويتم تعظيم نشاط لوحة المفاتيح والماوس والقرص أثناء إنشاء المفاتيح لزيادة إنتروبيا النظام.

لسوء الحظ ، هناك بعض السيناريوهات - على سبيل المثال ، على الأجهزة الافتراضية التي لا تحتوي على أجهزة حقيقية - حيث يؤدي عدم كفاية الإنتروبيا إلى إنشاء مفتاح الى ابعد حد بطيء. إذا واجهت هذه المشكلة ، فيجب عليك البحث عن وسائل زيادة إنتروبيا النظام. في أنظمة Linux الافتراضية ، يمكن تحقيق ذلك غالبًا عن طريق تثبيت حزمة أدوات rng. يتوفر هذا على الأقل في الأنظمة المستندة إلى RPM والمستندة إلى APT (توزيعات Red Hat / Fedora و Debian و Ubuntu والمشتقات).

تصدير المفاتيح¶

لتصدير المفاتيح ، استخدم طريقة () export_keys:

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

يحتوي أسلوب export_keys على بعض وسيطات الكلمات الرئيسية الإضافية:

  • armor (الافتراضي إلى True) - عندما يكون True ، يمرر --armor إلى gpg.
  • الحد الأدنى (الافتراضي إلى False) - عندما يكون True ، يمر --export-options export-min إلى gpg.
  • عبارة المرور - إذا تم تحديدها ، يتم إرسال عبارة المرور المحددة إلى gpg. بالنسبة إلى GnuPG & gt = 2.1 ، يتطلب تصدير المفاتيح السرية توفير عبارة مرور.
  • توقع_المسار - افتراضيات على True للتوافق مع الإصدارات السابقة. إذا كان سيتم تمرير عبارة المرور إلى gpg عبر pinentry ، فلن تقوم بتمريرها هنا - لذا حدد توقع_passphrase = False في هذه الحالة. إذا لم تفعل ذلك ، ولم تمرر عبارة مرور ، فسيتم رفع ValueError.

الجديد في الإصدار 0.3.7: تمت إضافة الدرع والحد الأدنى من وسيطات الكلمات الرئيسية.

الجديد في الإصدار 0.4.0: تمت إضافة وسيطة الكلمة الأساسية لعبارة المرور.

الجديد في الإصدار 0.4.2: تمت إضافة وسيطة الكلمة الأساسية تتوقع.

استيراد واستلام المفاتيح¶

لاستيراد المفاتيح ، احصل على البيانات الأساسية كسلسلة ASCII ، قل key_data. ثم:

سيؤدي هذا إلى استيراد جميع المفاتيح الموجودة في key_data. سيكون عدد المفاتيح المستوردة متاحًا في import_result.count وستكون بصمات المفاتيح المستوردة في import_result.fingerprints.

بالإضافة إلى ذلك ، يمكن تحديد معلمة الكلمة الأساسية extra_args و passphrase. إذا تم توفيره ، فسيتم التعامل مع extra_args كقائمة من الوسائط الإضافية لتمريرها إلى ملف gpg القابل للتنفيذ. إذا تم تحديد عبارة المرور ، فسيتم تمريرها إلى gpgg عندما يكون للمفتاح السري المستورد عبارة مرور.

الجديد في الإصدار 0.4.5: تمت إضافة وسيطة الكلمة الأساسية extra_args.

الجديد في الإصدار 0.4.7: تمت إضافة وسيطة الكلمة الأساسية لعبارة المرور.

لتلقي مفاتيح من خادم مفاتيح ، استخدم:

سيؤدي هذا إلى جلب المفاتيح بكل معرّفات المفاتيح المحددة واستيرادها. لاحظ أنه في نظام Windows ، قد تحتاج إلى برامج مساعدة مثل gpg_hkp.exe ، الموزعة مع GnuPG ، لتشغيل recv_keys بنجاح. في Jython ، قد تؤدي أذونات الأمان إلى فشل recv_keys.

لاحظ أنه عند استيراد المفاتيح ، قد تحصل على رسائل زائفة "انتهت صلاحية المفتاح" / "انتهت صلاحية التوقيع" والتي يتم إرسالها بواسطة gpg ويتم تجميعها بواسطة python-gnupg. قد يحدث هذا ، على سبيل المثال ، إذا تم تمديد تواريخ انتهاء صلاحية المفاتيح الفرعية ، بحيث لا تنتهي صلاحية المفاتيح بالفعل ، حتى عندما يرسل gpg الرسائل الموجودة لديهم. تأكد من إلقاء نظرة على سمات العد وبصمات الأصابع لتحديد المفاتيح التي تم استيرادها.

مفاتيح القوائم¶

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

القيمة التي يتم إرجاعها من list_keys () هي فئة فرعية من فئة قائمة Python. يمثل كل إدخال مفتاحًا واحدًا وهو قاموس Python يحتوي على معلومات مفيدة حول المفتاح المقابل.

الإدخالات التالية موجودة في القاموس المرتجع. بعض أسماء المفاتيح ليست مثالية لوصف القيم ، ولكن تُركت كما هي لأسباب التوافق مع الإصدارات السابقة. مع تحسن توثيق GnuPG ، أصبح من الممكن فهم المعلومات التي يتم إرجاعها بواسطة gpg بشكل أفضل.

مفتاح ديكت قيمة deb (جميع قيم السلسلة)
اكتب نوع المفتاح
ثقة صلاحية المفتاح
الطول طول المفتاح بالبتات
algo خوارزمية المفتاح العام
كييد معرف المفتاح
تاريخ تاريخ إنشاء المفتاح في UTC كطابع زمني Unix
تنتهي تاريخ انتهاء صلاحية المفتاح في UTC كطابع زمني ، إذا تم تحديده
غبي الرقم التسلسلي للشهادة أو تجزئة UID أو معلومات توقيع الثقة
الثقة الخاصة مستوى ثقة المالك للمفتاح
uid معرف المستخدم
سيج فئة التوقيع
قبعة القدرات الأساسية
المُصدر معلومات المُصدر
علم حقل العلم
رمز الرقم التسلسلي للرمز
تجزئة خوارزمية التجزئة
منحنى اسم المنحنى لمفاتيح تشفير المنحنى الإهليلجي (ECC)
امتثال إشارات الامتثال
محدث آخر طابع زمني تم تحديثه
الأصل أصل المفاتيح
مفاتيح فرعية قائمة تحتوي على [keyid، type] عناصر لكل مفتاح فرعي
subkey_info قاموس لمعلومات المفتاح الفرعي مرتبط بمعرف المفتاح الفرعي

اعتمادًا على إصدار gpg المستخدم ، قد يكون لبعض هذه المفاتيح القيمة "غير متوفر". يتم توفير المفتاحين الأخيرين بواسطة python-gnupg بدلاً من gpg.

لمزيد من المعلومات حول القيم الموجودة في هذا القاموس ، راجع وثائق GnuPG المرتبطة أعلاه. (لاحظ أن هذه الوثائق ليست سهلة الاستخدام بشكل رهيب ، ولكن مع ذلك يجب أن تكون قابلة للاستخدام.)

الجديد في الإصدار 0.3.8: القيمة التي تم إرجاعها من list_keys () تحتوي الآن على سمة جديدة ، key_map ، وهي مفتاح تعيين القاموس وبصمات المفاتيح الفرعية لقاموس المفتاح المقابل. مع هذا التغيير ، لن تحتاج إلى تكرار القائمة (التي من المحتمل أن تكون كبيرة) التي تم إرجاعها للبحث عن مفتاح ببصمة معينة - سيأخذك key_map deb مباشرة إلى المعلومات الأساسية ، سواء كانت بصمة الإصبع التي لديك لمفتاح أو مفتاح فرعي.

الجديد في الإصدار 0.3.8: يمكنك أيضًا سرد مجموعة فرعية من المفاتيح عن طريق تحديد وسيطة keys = keyword إلى list_keys () التي تكون قيمتها إما سلسلة واحدة تتطابق مع مفتاح ، أو قائمة سلاسل تطابق مفاتيح متعددة. في هذه الحالة ، تتضمن قيمة الإرجاع مفاتيح مطابقة فقط.

الجديد في الإصدار 0.3.9: تمت إضافة وسيطة sigs = كلمة أساسية جديدة إلى list_keys () ، وافتراضية إلى False. إذا حددت true ، فسيحتوي إدخال sigs في المعلومات الرئيسية التي تم إرجاعها على قائمة بالتوقيعات التي تنطبق على المفتاح. كل إدخال في القائمة عبارة عن 3 مجموعات (keyid ، معرف المستخدم ، فئة التوقيع) حيث يتم تحديد فئة التوقيع بواسطة RFC-4880.

ليس من المنطقي تقديم كل من السر = صحيح و sigs = True (لا يمكن للأشخاص توقيع المفاتيح السرية الخاصة بك) ، لذلك في حالة تحديد secret = True ، فإن sigs = value ليس لها أي تأثير.

الجديد في الإصدار 0.4.1: تحتوي مثيلات فئة GPG الآن على سمة on_data إضافية ، والتي يتم تعيينها افتراضيًا على None. يمكن تعيينه إلى قابل للاستدعاء والذي سيتم استدعاؤه باستخدام وسيطة واحدة - مجموعة ثنائية من البيانات المستلمة من ملف gpg القابل للتنفيذ. يمكن للمسموع أن يفعل ما يحلو له بالقطع التي تم تمريرها إليه - على سبيل المثال اكتبهم في دفق منفصل. يجب ألا يثير الاستدعاء أي استثناءات (إلا إذا كان يريد فشل العملية الحالية).

الجديد في الإصدار 0.4.2: المعلومات حول المفاتيح التي تم إرجاعها بواسطة list_keys () أو scan_keys () تتضمن الآن قاموس subkey_info ، والذي يحتوي على أي معلومات تم إرجاعها حول المفاتيح الفرعية مثل تاريخ الإنشاء وانتهاء الصلاحية. القاموس مرتبط بمعرف المفتاح الفرعي. توجد المفاتيح الإضافية التالية في قواميس المعلومات الأساسية: cap ، المُصدر ، العلامة ، الرمز المميز ، التجزئة ، المنحنى ، التوافق ، التحديث والأصل.

الجديد في الإصدار 0.4.4: تحتوي مثيلات فئة GPG الآن على سمة check_fingerprint_collisions إضافية ، والتي يتم تعيينها افتراضيًا على False. إذا تم التعيين على قيمة صحيحة ، فسيتم التحقق من تضارب بصمات الأصابع (ويتم رفع خطأ القيمة إذا تم اكتشاف تصادم) عند إدراج المفاتيح أو مسحها ضوئيًا. يبدو أن gpg متساهل تمامًا بشأن السماح بالمفاتيح المكررة في سلاسل المفاتيح ، مما قد يؤدي إلى حدوث تصادمات.

تم التغيير في الإصدار 0.4.4: سيتم الآن استدعاء on_data القابل للاستدعاء بقطعة فارغة عندما يتم استنفاد دفق البيانات من gpg. يمكنه الآن أيضًا إرجاع قيمة: إذا تم إرجاع القيمة False ، فسيتم إرجاع القطعة ليس يتم تخزينها في Python-gnupg. قد يكون هذا مفيدًا إذا كنت تريد إجراء التخزين المؤقت الخاص بك أو تجنب التخزين المؤقت تمامًا. إذا تم إرجاع أي قيمة أخرى (بما في ذلك القيمة لا شيء ، للتوافق مع الإصدارات السابقة) ، فسيتم تخزين القطعة كالمعتاد بواسطة python-gnupg.

الجديد في الإصدار 0.4.6: تحتوي مثيلات فئة GPG الآن على سمة error_map إضافية ، والتي يتم تعيينها افتراضيًا على None. إذا قمت بتعيين هذا ، يجب أن تكون القيمة عبارة عن قاموس يعين رموز الخطأ لرسائل الخطأ. يتضمن توزيع المصدر ملف messages.json الذي يحتوي على مثل هذا التعيين ، تم الحصول عليه من مكتبة GnuPG libgpg-error ، الإصدار 1.37. تُظهر مجموعة الاختبار كيفية تحويل JSON إلى نموذج مناسب للتحويل إلى قيمة error_map (أساسًا ، تحويل مفاتيح السلسلة في JSON إلى أعداد صحيحة باستخدام الأساس 16).

تعيين مستوى الثقة للمفاتيح المستوردة¶

يمكنك تعيين مستوى الثقة للمفاتيح المستوردة كما يلي:

حيث تكون بصمات الأصابع قائمة بصمات أصابع المفاتيح التي سيتم تعيين مستوى الثقة لها ، ومستوى الثقة هو أحد قيم السلسلة "TRUST_UNDEFINED" أو "TRUST_NEVER" أو "TRUST_MARGINAL" أو "TRUST_FULLY" أو "TRUST_ULTIMATE".

يمكنك أيضًا تحديد بصمة إصبع واحدة لمعلمة بصمات الأصابع.

الجديد في الإصدار 0.4.2: تم إضافة طريقة trust_keys.

مفاتيح المسح¶

يمكننا أيضًا فحص المفاتيح في الملفات دون استيرادها إلى سلسلة مفاتيح محلية ، على النحو التالي:

القيمة التي تم إرجاعها من scan_keys () لها نفس تنسيق list_keys ().

الجديد في الإصدار 0.3.7: تمت إضافة طريقة scan_keys.

حذف المفاتيح¶

لحذف المفاتيح ، يجب تحديد معرّفات المفاتيح الخاصة بهم. إذا تم إنشاء زوج مفاتيح عام / خاص ، فيجب حذف مفتاح خاص قبل حذف المفتاح العام:

يمكن أن تكون الوسيطة التي تمررها إلى delete_keys () إما معرف مفتاح واحد (مثل keyid أو بصمة الإصبع) أو سلسلة من معرفات المفاتيح.

يحتوي أسلوب delete_keys على بعض وسيطات الكلمات الرئيسية الإضافية:

  • عبارة المرور - إذا تم تحديدها ، يتم إرسال عبارة المرور المحددة إلى gpg. بالنسبة إلى GnuPG & gt = 2.1 ، يتطلب تصدير المفاتيح السرية توفير عبارة مرور.
  • توقع_المسار - افتراضيات على True للتوافق مع الإصدارات السابقة. إذا كان سيتم تمرير عبارة المرور إلى gpg عبر pinentry ، فلن تقوم بتمريرها هنا - لذا حدد توقع_passphrase = False في هذه الحالة. إذا لم تفعل ذلك ، ولم تمرر عبارة مرور ، فسيتم رفع ValueError.

الجديد في الإصدار 0.4.0: تمت إضافة وسيطة الكلمة الأساسية لعبارة المرور.

الجديد في الإصدار 0.4.2: تمت إضافة وسيطة الكلمة الأساسية تتوقع.

البحث عن المفاتيح¶

يمكنك البحث عن المفاتيح عن طريق تمرير استعلام البحث واختياريا اسم خادم المفاتيح. إذا لم يتم تحديد خادم مفاتيح ، فسيتم استخدام pgp.mit.edu. تم إرجاع قائمة بالقواميس التي تصف المفاتيح التي تم العثور عليها (قد تكون هذه القائمة فارغة). فمثلا:

الجديد في الإصدار 0.3.5: تمت إضافة طريقة search_keys.

مفاتيح الإرسال¶

يمكنك إرسال مفاتيح إلى خادم مفاتيح عن طريق تمرير اسمه وبعض معرفات المفاتيح. فمثلا:

الجديد في الإصدار 0.3.5: تمت إضافة طريقة send_keys.


تخصيص

بالنسبة إلى & quot كائنات مثل & quot ، تحتوي المكتبة القياسية بالفعل على نوع قد يشكل أساسًا للتفاعل المتوافق بين الحزم إذا كانت كل حزمة تشير إلى العلاقة بين عمليات الأنواع وعمليات ملف اكتب ، ثم يمكن لهذه الحزم قبول كائنات الحزم الأخرى كـ :ملف حدود.

ومع ذلك ، لا يمكن للمكتبة القياسية أن تحتوي على إصدارات أساسية لجميع العمليات الممكنة التي قد توجد لها تطبيقات متعددة ، لذلك فإن الحزم المختلفة لا بد أن تخلق تصورات مختلفة لنفس العمليات الأساسية. على سبيل المثال ، حزمة واحدة بطة قد يكون للفصل يمشي() و الدجال() الطرق ، حيث قد تحتوي الحزمة الأخرى على ملف مالارد فئة (نوع من البط) مع تهادى() و التزمير () أساليب. وربما تحتوي حزمة أخرى على فئة بها moveLeftLeg () و moveRightLeg () الطرق التي يجب دمجها من أجل تقديم عملية مكافئة لـ بطة ووك () .

بافتراض أن العبوة تحتوي على بطة له وظيفة مثل هذه (باستخدام صيغة الكتابة الاختيارية المقترحة من Guido 2):

تتوقع هذه الوظيفة أ بطة على سبيل المثال ، ولكن ماذا لو أردنا استخدام ملف مالارد من الحزمة الأخرى؟

الإجابة البسيطة هي السماح لبرامج Python بأن تنص صراحةً على أن عملية (أي وظيفة أو طريقة) من نوع واحد لها دلالات تتوافق تقريبًا مع تلك الخاصة بعملية يمتلكها نوع مختلف. أي أننا نريد أن نكون قادرين على قول ذلك مالارد وادل (مخرج) هي & مثل & quot الطريقة بطة ووك () . (بالنسبة لأمثلةنا ، سنستخدم المصممين للإعلان عن هذا & quotlike & quot-ness ، ولكن بالطبع يمكن أيضًا توسيع بناء جملة Python إذا رغبت في ذلك.)

إذا كنا مؤلف مالارد الصف ، يمكننا أن نعلن توافقنا مثل هذا:

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

في هذه الحالة ، يمكنك إنشاء ما سنسميه & quot عملية خارجية & quot ، وهي مجرد وظيفة تم الإعلان عنها خارج الفئة التي تنطبق عليها. إنها مطابقة تقريبًا للعملية الداخلية & quot التي أعلناها داخل مالارد فئة ، ولكن يجب أن تستدعي تهادى() الطريقة ، نظرًا لأنها لا تنفذ أيضًا التمايل:

بغض النظر عن طريقة تسجيل مراسلات العملية ، يجب أن نتمكن الآن من الاتصال بنجاح WalkTheDuck (مالارد ()) . ستنشئ Python تلقائيًا كائنًا موسعًا يلف ملف مالارد المثال مع أ بطة واجهة تشبه. سيكون لهذا الموسع امتداد يمشي() الطريقة التي هي مجرد نسخة معاد تسميتها من مالارد المثيل تهادى() طريقة (أو من بطة عملية خارجية).

لأية طرق بطة التي ليس لها مقابل مالارد العملية ، سوف يحذف الموسع تلك السمة ، وبالتالي الحفاظ على التوافق مع الإصدارات السابقة مع التعليمات البرمجية التي تستخدم استبطان السمة أو الاعتراضات خطأ في السمة للتحكم في السلوكيات الاختيارية. بمعنى آخر ، إذا كان لدينا ملف MuteMallard فئة ليس لديها القدرة على الدجال() ، ولكن لديها عملية مناظرة لـ يمشي() ، لا يزال بإمكاننا تمرير مثيلاتها بأمان إلى walkTheDuck () ، ولكن إذا مررنا MuteMallard إلى روتين يحاول القيام بذلك الدجال ، سيحصل هذا الروتين على ملف خطأ في السمة .


إجراء ارتباك في الوحدة

من المنطقي أحيانًا التفكير في أن job.hour.every (2) ستحدد جميع وحدات المتابعة على "0" وبالتالي ينتج عنها "0 * / 2 * * *". وبدلاً من ذلك ، فأنت تتحكم فقط في وحدات الساعات ولن يتأثر عمود الدقائق. ستكون النتيجة الحقيقية "* * / 2 * * *" وربما تكون غير متوقعة لأولئك الذين ليسوا على دراية بـ crontabs.

هناك طريقة "كل" خاصة في الوظيفة لمسح الجدول الزمني الحالي للوظيفة واستبدالها بوحدة واحدة بسيطة:

هذه طريقة ملائمة فقط ، فهي تقوم بأشياء عادية مع واجهة برمجة التطبيقات الموجودة.


أنماط - رسم

تحقق الأنماط غرضين: تفرض قيودًا (هيكلية) على الموضوع وتحدد قيم البيانات التي يجب استخراجها من الموضوع وربطها بالمتغيرات. في التفريغ المتكرر ، والذي يمكن اعتباره نموذجًا أوليًا لمطابقة الأنماط في Python ، يوجد واحد فقط النمط الهيكلي للتعبير عن التسلسلات بينما هناك مجموعة غنية من أنماط ملزمة لتعيين قيمة لمتغير أو حقل معين. تختلف مطابقة النمط الكامل عن هذا في وجود تنوع أكبر في الأنماط الهيكلية ولكن فقط الحد الأدنى من أنماط الربط.

تختلف الأنماط عن أهداف التخصيص (كما هو الحال في التفريغ المتكرر) بطريقتين: فهي تفرض قيودًا إضافية على بنية الموضوع ، وقد يفشل الموضوع بأمان في مطابقة نمط معين في أي نقطة (في التفريغ المتكرر ، يشكل هذا خطأ) . هذا الأخير يعني أن هذا النمط يجب أن يتجنب الآثار الجانبية حيثما أمكن ذلك.

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

حجر الزاوية في مطابقة النمط هو إمكانية التعسفي أنماط التعشيش. يسمح التعشيش بالتعبير عن هياكل الأشجار العميقة (للحصول على مثال لأنماط الطبقة المتداخلة ، راجع قسم التحفيز أعلاه) بالإضافة إلى البدائل.

على الرغم من أن الأنماط قد تبدو ظاهريًا مثل التعبيرات ، فمن المهم أن تضع في اعتبارك أن هناك تمييزًا واضحًا. في الواقع ، لا يوجد نمط أو يحتوي على تعبير. من الأفضل التفكير في الأنماط كعناصر توضيحية مشابهة للمعلمات الرسمية في تعريف الوظيفة.

أنماط AS

تنقسم الأنماط إلى فئتين: تفرض معظم الأنماط قيدًا (بنيويًا) يحتاج الموضوع إلى تحقيقه ، في حين أن نمط الالتقاط يربط الموضوع باسم ما دون النظر إلى بنية الموضوع أو القيمة الفعلية. وبالتالي ، يمكن أن يعبر النمط عن قيد أو أن يربط قيمة ، ولكن ليس كلاهما. تملأ أنماط AS هذه الفجوة لأنها تسمح للمستخدم بتحديد نمط عام وكذلك التقاط الموضوع في متغير.

تتضمن حالات الاستخدام النموذجية لنمط AS أنماط OR و Class جنبًا إلى جنب مع اسم ملزم كما في ، على سبيل المثال ، حالة BinOp ('+' | '-' مثل المرجع السابق): أو الحالة [int () as first، int () as second]:. يمكن فهم هذا الأخير على أنه يقول أن الموضوع يجب أن يحقق نمطين متميزين: [الثانية الأولى] إلى جانب [int () ، int ()] . وبالتالي يمكن اعتبار نمط AS كحالة خاصة لنمط "و" (انظر أنماط OR أدناه للحصول على مناقشة إضافية للأنماط "و").

في إصدار سابق ، تم تصميم نمط AS على أنه "نمط Walrus" ، مكتوب كـ الحالة [أولًا: = int () ، ثانيًا: = int ()] . ومع ذلك ، باستخدام كما يقدم بعض المزايا :=:

  • عامل الفظ := يستخدم لالتقاط نتيجة تعبير على الجانب الأيمن ، بينما كما يشير بشكل عام إلى شكل من أشكال "المعالجة" كما هو الحال في استيراد foo كشريط أو باستثناء E كخطأ:. في الواقع ، النمط ف مثل س لا يعين النمط ص ل x، بل الموضوع الذي يطابق بنجاح ص.
  • كما يسمح بتدفق بيانات أكثر اتساقًا من اليسار إلى اليمين (تتبع السمات في أنماط الفصل أيضًا تدفق بيانات من اليسار إلى اليمين).
  • يبدو عامل الفظ مشابهًا جدًا لصيغة مطابقة السمات في نمط الفئة ، مما قد يؤدي إلى بعض الالتباس.

مثال باستخدام نمط AS:

أنماط أو

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

تحظر اللغات المكتوبة إحصائيًا ربط الأسماء (أنماط الالتقاط) داخل نمط OR بسبب التعارضات المحتملة فيما يتعلق بأنواع المتغيرات. كلغة مكتوبة ديناميكيًا ، يمكن أن تكون Python أقل تقييدًا هنا وتسمح بأنماط الالتقاط داخل أنماط OR. ومع ذلك ، يجب أن يربط كل نمط فرعي نفس مجموعة المتغيرات حتى لا يترك أسماء غير محددة. مع بديلين ص | س، هذا يعني أنه إذا ص يربط المتغيرات ش و الخامس, س يجب أن تربط المتغيرات نفسها تمامًا ش و الخامس.

كان هناك بعض النقاش حول استخدام رمز الشريط | أو ال أو الكلمة الأساسية لبدائل منفصلة. لا يتلاءم نمط OR تمامًا مع الدلالات الموجودة واستخدام أي من هذين الرمزين. ومع ذلك، | هو الرمز المفضل في جميع لغات البرمجة مع دعم نمط OR ويستخدم بهذه السعة للتعبيرات العادية في Python أيضًا. إنه أيضًا الفاصل التقليدي بين البدائل في القواعد النحوية الرسمية (بما في ذلك بايثون). وعلاوة على ذلك، | لا يستخدم فقط للبت في OR ، ولكن أيضًا لتعيين الاتحادات ودمج الإملاء (PEP 584).

تم أخذ البدائل الأخرى في الاعتبار أيضًا ، ولكن لم يسمح أي منها بتداخل أنماط OR داخل أنماط أخرى:

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

هذه هي الطريقة التي سيتم بها ذلك في ج، باستخدام دلالات سقوطه للحالات. ومع ذلك ، لا نريد تضليل الأشخاص للاعتقاد بأن المطابقة / الحالة تستخدم دلالات غير متوقعة (والتي تعد مصدرًا شائعًا للأخطاء في ج). أيضًا ، سيكون هذا نمطًا جديدًا للمسافة البادئة ، مما قد يجعل من الصعب دعمه في IDEs وما إلى ذلك (قد يكسر القاعدة البسيطة "إضافة مستوى مسافة بادئة بعد سطر ينتهي بنقطتين"). أخيرًا ، لن يدعم هذا أيضًا أنماط OR المتداخلة داخل أنماط أخرى.

استخدام "حالة في" متبوعًا بقائمة مفصولة بفواصل:

لن يعمل هذا مع أنماط OR المتداخلة داخل أنماط أخرى ، مثل:

أنماط "و" وليس

نظرًا لأن هذا الاقتراح يعرّف نمط OR (|) لمطابقة أحد البدائل العديدة ، فلماذا لا يكون أيضًا نمط AND (& أمبير) أو حتى نمط NOT (!)؟ خاصة وأن بعض اللغات الأخرى (F# على سبيل المثال) دعم أنماط AND.

ومع ذلك ، ليس من الواضح مدى فائدة ذلك. دلالات القواميس والكائنات والتسلسلات المطابقة تتضمن بالفعل 'و' ضمنيًا: يجب أن تكون جميع السمات والعناصر المذكورة موجودة حتى تنجح المطابقة. يمكن أن تدعم ظروف الحماية أيضًا العديد من حالات الاستخدام التي سيتم استخدام عامل تشغيل افتراضي لها.

نفي نمط المطابقة باستخدام عامل التشغيل ! كبادئة تتطابق تمامًا إذا كان النمط نفسه لا يتطابق. على سبيل المثال، !(3 | 4) سوف تتطابق مع أي شيء باستثناء 3 أو 4. ومع ذلك ، هناك أدلة من لغات أخرى على أن هذا نادرًا ما يكون مفيدًا ، ويستخدم بشكل أساسي كنفي مزدوج !! للتحكم في النطاقات المتغيرة ومنع الارتباطات المتغيرة (التي لا تنطبق على بايثون). يتم التعبير عن حالات الاستخدام الأخرى بشكل أفضل باستخدام الحراس.

في النهاية ، تقرر أن هذا سيجعل بناء الجملة أكثر تعقيدًا دون إضافة فائدة كبيرة. يمكن دائمًا إضافته لاحقًا.

مثال باستخدام نمط OR:

الأنماط الحرفية

تعد الأنماط الحرفية طريقة مناسبة لفرض قيود على قيمة الموضوع ، بدلاً من نوعه أو هيكله. كما أنها تسمح لك بمحاكاة بيان التبديل باستخدام مطابقة النمط.

بشكل عام ، تتم مقارنة الموضوع بالنمط الحرفي عن طريق المساواة القياسية (س == ص في بناء جملة بايثون). وبالتالي ، فإن الأنماط الحرفية 1.0 و 1 تطابق تمامًا نفس مجموعة العناصر ، أي الحالة 1.0: و حالة 1: قابلة للتبديل بالكامل. مبدئيا، حقيقي سيطابق أيضًا نفس مجموعة الكائنات لأن صحيح == 1 يحمل. ومع ذلك ، نعتقد أن العديد من المستخدمين سوف يفاجأون بالعثور على ذلك الحالة صحيح: تطابق الموضوع 1.0، مما أدى إلى بعض الأخطاء الدقيقة والحلول المعقدة. لذلك اعتمدنا قاعدة أن الأنماط المفردة الثلاثة لا أحد, خاطئة و حقيقي تطابق بالهوية (س هو ص في بناء جملة بايثون) بدلاً من المساواة. بالتالي، الحالة صحيح: سوف تتطابق فقط حقيقي ولا شيء غير ذلك. لاحظ أن حالة 1: ستظل تتطابق حقيقي، رغم ذلك ، لأن النمط الحرفي 1 يعمل بالمساواة وليس بالهوية.

الأفكار المبكرة للحث على التسلسل الهرمي للأرقام بحيث حالة 1.0 سوف تتطابق مع كل من العدد الصحيح 1 ورقم النقطة العائمة 1.0، بينما حالة 1: سوف يتطابق فقط مع العدد الصحيح 1 تم إسقاطها في النهاية لصالح القاعدة الأبسط والأكثر اتساقًا القائمة على المساواة. علاوة على ذلك ، فإن أي يتحقق إضافي مما إذا كان الموضوع هو مثيل الأرقام بتكلفة عالية لوقت التشغيل لتقديم فكرة جديدة في بايثون. عند الحاجة ، بناء الجملة الصريح كيس int (1): يمكن استعماله.

تذكر أن الأنماط الحرفية هي ليس التعبيرات ، ولكنها تشير مباشرة إلى قيمة محددة. من وجهة نظر عملية ، نريد السماح باستخدام القيم السالبة وحتى المعقدة كنماذج حرفية ، لكنها ليست حرفية ذرية (فقط الأرقام الحقيقية والخيالية غير الموقعة هي). على سبيل المثال ، -3 + 4 ج هو من الناحية التركيبية تعبير عن النموذج BinOp (UnaryOp ('-'، 3)، '+'، 4j). نظرًا لأن التعبيرات ليست جزءًا من الأنماط ، كان علينا إضافة دعم نحوي صريح لمثل هذه القيم دون الحاجة إلى اللجوء إلى التعبيرات الكاملة.

محرف Fمن ناحية أخرى ، لا تعتبر السلاسل قيمًا حرفية ، على الرغم من مظهرها ، وبالتالي لا يمكن استخدامها كنماذج حرفية (ومع ذلك ، يتم دعم تسلسل السلسلة).

لا تحدث الأنماط الحرفية فقط كنماذج في حد ذاتها ، ولكن أيضًا كمفاتيح في رسم الخرائط.

أنماط مطابقة النطاق. هذا من شأنه أن يسمح بأنماط مثل 1. 6 . ومع ذلك ، هناك مجموعة من نقاط الغموض:

  • هل النطاق مفتوح أم نصف مفتوح أم مغلق؟ (أي هو 6 المدرجة في المثال أعلاه أم لا؟)
  • هل يطابق النطاق رقمًا واحدًا أم كائن نطاق؟
  • غالبًا ما يتم استخدام مطابقة النطاق لنطاقات الأحرف ("a". "z") ولكن هذا لن يعمل في Python نظرًا لعدم وجود نوع بيانات حرف ، فقط سلاسل.
  • يمكن أن تكون مطابقة النطاق تحسينًا مهمًا للأداء إذا كان بإمكانك إنشاء جدول قفزة مسبقًا ، لكن هذا غير ممكن بشكل عام في Python نظرًا لحقيقة أن الأسماء يمكن ارتدادها ديناميكيًا.

بدلاً من إنشاء صيغة حالة خاصة للنطاقات ، تقرر السماح لكائنات النمط المخصصة (InRange (0، 6)) ستكون أكثر مرونة وأقل غموضًا ، ولكن تم تأجيل هذه الأفكار في الوقت الحالي.

مثال باستخدام الأنماط الحرفية:

التقاط الأنماط

تتخذ أنماط الالتقاط شكل اسم يقبل أي قيمة ويربطها بمتغير (محلي) (ما لم يتم الإعلان عن الاسم على أنه غير محلي أو عالمي). بهذا المعنى ، يشبه نمط الالتقاط معلمة في تعريف الوظيفة (عندما يتم استدعاء الوظيفة ، تربط كل معلمة الوسيطة المعنية بمتغير محلي في نطاق الوظيفة).

يجب ألا يتطابق الاسم المستخدم لنمط الالتقاط مع نمط التقاط آخر في نفس النمط. هذا ، مرة أخرى ، مشابه للمعلمات ، التي تتطلب أيضًا أن يكون كل اسم معلمة فريدًا في قائمة المعلمات. ومع ذلك ، فهو يختلف عن تخصيص التفريغ المتكرر ، حيث يُسمح بالاستخدام المتكرر لاسم متغير كهدف (على سبيل المثال ، س ، س = 1 ، 2). الأساس المنطقي لعدم الدعم (س ، س) في الأنماط هي قراءتها الغامضة: يمكن رؤيتها في التفريغ المتكرر حيث يكون الارتباط الثاني فقط x يعيش. ولكن يمكن أن يُنظر إليه أيضًا على أنه عبارة عن مجموعة مكونة من عنصرين متساويين (والتي تأتي مع مشكلاتها الخاصة). إذا دعت الحاجة ، فلا يزال من الممكن تقديم دعم للاستخدام المتكرر للأسماء فيما بعد.

كانت هناك دعوات لوضع علامة صريحة على أنماط الالتقاط وبالتالي تحديدها كأهداف ملزمة. وفقًا لهذه الفكرة ، سيتم كتابة نمط الالتقاط على النحو التالي ، على سبيل المثال ؟ x , x دولار أو = س. الهدف من علامات الالتقاط الصريحة هذه هو السماح للاسم غير المميز بأن يكون نمط قيمة (انظر أدناه). ومع ذلك ، يعتمد هذا على الاعتقاد الخاطئ بأن مطابقة الأنماط كانت امتدادًا لـ تحول عبارات ، مع التركيز على التبديل السريع بناءً على القيم (الترتيبية). مثل هذا تحول تم بالفعل اقتراح العبارة لـ Python من قبل (انظر PEP 275 و PEP 3103). من ناحية أخرى ، تبني مطابقة الأنماط مفهومًا عامًا للتفريغ المتكرر. تعد القيم الملزمة المستخرجة من بنية البيانات في صميم المفهوم ، وبالتالي فهي حالة الاستخدام الأكثر شيوعًا. وبالتالي ، فإن العلامات الصريحة لأنماط الالتقاط ستخون الهدف من بناء جملة مطابقة النمط المقترح وتبسط حالة استخدام ثانوية على حساب الفوضى النحوية الإضافية للحالات الأساسية.

تم اقتراح أن أنماط الالتقاط ليست ضرورية على الإطلاق ، حيث يمكن الحصول على التأثير المكافئ من خلال الجمع بين نمط AS ونمط حرف البدل (على سبيل المثال ، الحالة _ مثل x يعادل حالة x). ومع ذلك ، قد يكون هذا مطولًا بشكل غير سار ، لا سيما بالنظر إلى أننا نتوقع أن تكون أنماط الالتقاط شائعة جدًا.

مثال باستخدام أنماط الالتقاط:

نمط البدل

نمط أحرف البدل هو حالة خاصة لنمط "الالتقاط": فهو يقبل أي قيمة ، لكنه لا يربطها بمتغير. الفكرة وراء هذه القاعدة هي دعم الاستخدام المتكرر لحرف البدل في الأنماط. بينما (س ، س) هو خطأ ، (_, _) هو قانوني.

لا سيما في الأنماط الأكبر (التسلسل) ، من المهم السماح للنمط بالتركيز على القيم ذات الأهمية الفعلية مع تجاهل أي شيء آخر. بدون حرف بدل ، سيكون من الضروري "اختراع" عدد من المتغيرات المحلية ، والتي ستكون ملزمة ولكنها لا تستخدم أبدًا. حتى عند التمسك باتفاقيات التسمية واستخدام على سبيل المثال _1, _2, _3 لتسمية القيم غير ذات الصلة ، على سبيل المثال ، لا يزال هذا يتسبب في حدوث فوضى بصرية ويمكن أن يضر بالأداء (قارن نمط التسلسل (س ، ص ، * ض) ل (_ ، ص ، * _)، أين ال * ض يجبر المترجم الفوري على نسخ تسلسل طويل جدًا ، في حين أن الإصدار الثاني يجمع ببساطة إلى رمز على طول أسطر y = seq [1]).

كان هناك الكثير من النقاش حول اختيار الشرطة السفلية كـ _ كنمط حرف بدل ، أي جعل هذا الاسم الواحد غير ملزم. ومع ذلك ، يتم بالفعل استخدام الشرطة السفلية بكثرة كعلامة "تجاهل القيمة" في التفريغ المتكرر. منذ نمط البدل _ لا يرتبط أبدًا ، هذا الاستخدام للشرطة السفلية لا يتعارض مع الاستخدامات الأخرى مثل داخل REPL أو الحصول على النص وحدة.

تم اقتراح استخدامه . (أي رمز القطع) أو * (نجمة) كحرف بدل. ومع ذلك ، يبدو كلاهما كما لو تم حذف عدد تعسفي من العناصر:

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

سيكون البديل الذي لا يشير إلى عدد تعسفي من العناصر ?. تم اقتراح هذا بشكل مستقل عن مطابقة الأنماط في PEP 640. لكننا نشعر بذلك باستخدام ? كهدف "تعيين" خاص ، من المحتمل أن يكون الأمر أكثر إرباكًا لمستخدمي Python من استخدام _. إنه ينتهك مبدأ Python (الغامض بشكل واضح) المتمثل في استخدام علامات الترقيم فقط بطرق مشابهة لكيفية استخدامها في الاستخدام الشائع للغة الإنجليزية أو في رياضيات المدرسة الثانوية ، ما لم يكن الاستخدام كذلك جدا راسخ في لغات البرمجة الأخرى (مثل ، على سبيل المثال ، استخدام نقطة لوصول الأعضاء).

فشلت علامة الاستفهام في كلتا الحالتين: فاستخدامها في لغات البرمجة الأخرى هو عبارة عن مجموعة من الاستخدامات التي تقترحها فكرة "السؤال" بشكل غامض فقط. على سبيل المثال ، تعني "أي حرف" في shell globbing ، و "ربما" في التعبيرات العادية ، و "التعبير الشرطي" في لغة C والعديد من اللغات المشتقة من C ، و "الوظيفة الأصلية" في المخطط ، و "تعديل معالجة الأخطاء" في Rust ، " الوسيطة "و" التسلسل الاختياري "في TypeScript (تم اقتراح المعنى الأخير أيضًا لـ Python بواسطة PEP 505). يقترح PEP الذي لم يتم تسميته حتى الآن وضع علامة على الأنواع الاختيارية ، على سبيل المثال كثافة العمليات؟.

استخدام آخر شائع لـ ? في أنظمة البرمجة هي "مساعدة" ، على سبيل المثال ، في IPython و Jupyter Notebooks والعديد من أدوات سطر الأوامر التفاعلية.

بالإضافة إلى ذلك ، سيؤدي هذا إلى وضع Python في موضع فريد نوعًا ما: الشرطة السفلية هي بمثابة نمط بدل في كل لغة البرمجة مع مطابقة الأنماط التي يمكن أن نجدها (بما في ذلك سي #, إكسير, إرلانج, F#, جمال, هاسكل, الرياضيات, OCaml, روبي, الصدأ, سكالا, سويفت، و شوكة). مع الأخذ في الاعتبار أن العديد من مستخدمي Python يعملون أيضًا مع لغات برمجة أخرى ، ولديهم خبرة سابقة عند تعلم Python ، وقد ينتقلون إلى لغات أخرى بعد تعلم Python ، نجد أن هذه المعايير الراسخة مهمة وذات صلة فيما يتعلق بقابلية القراءة وقابلية التعلم. في رأينا ، المخاوف من أن حرف البدل هذا يعني أن الاسم العادي يتلقى معاملة خاصة ليست قوية بما يكفي لإدخال بناء جملة من شأنه أن يجعل Python مميزة.

كتل أخرى. كتلة حالة بدون حارس يكون نمطها عبارة عن حرف بدل واحد (أي ، قضية _:) يقبل أي موضوع دون ربطه بمتغير أو إجراء أي عملية أخرى. وبالتالي فهو مكافئ لغويًا لـ آخر:، إذا كانت مدعومة. ومع ذلك ، فإن إضافة كتلة else إلى بناء جملة عبارة match لن تزيل الحاجة إلى نمط أحرف البدل في سياقات أخرى. حجة أخرى ضد هذا هو أنه سيكون هناك مستويان معقولان للمسافة البادئة لكتلة أخرى: المحاذاة مع قضية أو تتماشى مع مباراة. وجد المؤلفون أنه من المثير للجدل تحديد مستوى المسافة البادئة الذي يفضله.

مثال باستخدام نمط Wildcard:

أنماط القيمة

إنه أسلوب برمجة جيد لاستخدام الثوابت المسماة للقيم البارامترية أو لتوضيح معنى قيم معينة. من الواضح أنه من الأفضل أن تكتب حالة (HttpStatus.OK ، جسم): خلال العلبة (200 ، جسم):، فمثلا. القضية الرئيسية التي تنشأ هنا هي كيفية التمييز بين أنماط الالتقاط (الارتباطات المتغيرة) من أنماط القيمة. لقد أدت المناقشة العامة التي دارت حول هذه القضية إلى طرح عدد كبير من الخيارات ، والتي لا يمكننا جميعًا سردها بالكامل هنا.

بالمعنى الدقيق للكلمة ، أنماط القيم ليست ضرورية حقًا ، ولكن يمكن تنفيذها باستخدام الحراس ، أي الحالة (الحالة ، الجسم) إذا كانت الحالة == HttpStatus.OK:. ومع ذلك ، فإن ملاءمة أنماط القيمة واضحة وواضحة.

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

قاعدة مقترحة لاستخدام نقطة بادئة (على سبيل المثال .مستمر) لهذا الغرض تم انتقاده لأنه كان هناك شعور بأن النقطة لن تكون علامة مرئية بما يكفي لهذا الغرض. مستوحاة جزئيًا من النماذج الموجودة في لغات البرمجة الأخرى ، تم اقتراح عدد من العلامات / sigils المختلفة (مثل ^ ثابت, ثابت, == ثابت, مستمر؟، أو الكلمة الموجودة في backticks) ، على الرغم من عدم وجود خيار واضح أو طبيعي. ولذلك ، فإن الاقتراح الحالي يترك المناقشة وإمكانية تقديم مثل هذا المؤشر "الثابت" ل PEP في المستقبل.

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

مثال باستخدام نمط القيمة:

أنماط المجموعة

يُعد السماح للمستخدمين بتحديد التجميع بشكل صريح مفيدًا بشكل خاص في حالة أنماط "أو".

أنماط التسلسل

تتبع أنماط التسلسل بأكبر قدر ممكن بناء الجملة المعتمد بالفعل ودلالات التفريغ المتكرر. بالطبع ، تحل الأنماط الفرعية محل أهداف التعيين (المتغيرات والسمات والمنخفضة). علاوة على ذلك ، يتطابق نمط التسلسل فقط مع مجموعة مختارة بعناية من الموضوعات المحتملة ، في حين يمكن تطبيق التفريغ المتكرر على أي متكرر.

  • كما هو الحال في التفريغ المتكرر ، لا نميز بين ترميز "tuple" و "list". [أ ، ب ، ج], (أ ، ب ، ج) و أ ، ب ، ج كلها متكافئة. في حين أن هذا يعني أن لدينا تدوينًا مكررًا وأن التحقق تحديدًا من القوائم أو المجموعات يتطلب مزيدًا من الجهد (على سبيل المثال قائمة الحالات ([أ ، ب ، ج])) ، فنحن نحاكي التفريغ القابل للتكرار قدر الإمكان.
  • سوف يلتقط النمط المميز بنجمة تسلسلًا فرعيًا من الطول التعسفي ، ويعكس مرة أخرى التفريغ المتكرر. قد يوجد عنصر واحد فقط مميز بنجمة في أي نمط تسلسلي. من الناحية النظرية ، فإن أنماط مثل (*_, 3, *_) يمكن فهمها على أنها تعبر عن أي تسلسل يحتوي على القيمة 3. ومع ذلك ، من الناحية العملية ، لن ينجح هذا إلا في مجموعة ضيقة جدًا من حالات الاستخدام ويؤدي إلى تراجع غير فعال أو حتى حالات غموض بخلاف ذلك.
  • نمط التسلسل يفعل ليس التكرار من خلال موضوع قابل للتكرار. يتم الوصول إلى جميع العناصر من خلال الاشتراك والتقطيع ، ويجب أن يكون الموضوع مثيلاً لـ المجموعات. abc. التسلسل. يتضمن هذا ، بالطبع ، القوائم والمجموعات ، ولكنه يستثني على سبيل المثال المجموعات والقواميس. على الرغم من أنه سيتضمن السلاسل والبايتات ، فإننا نستثني هذه (انظر أدناه).

لا يمكن لنمط التسلسل أن يتكرر عبر أي كائن قابل للتكرار فقط. يجب التراجع عن استهلاك العناصر من التكرار إذا فشل النمط العام ، وهو أمر غير ممكن.

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

كائنات السلسلة والبايت لها طبيعة مزدوجة: فهما كائنات "ذرية" في حد ذاتها ، بالإضافة إلى متواليات (ذات طبيعة تكرارية بقوة في أن السلسلة هي سلسلة من السلاسل). يختلف السلوك النموذجي وحالات الاستخدام للسلاسل والبايتات بشكل كافٍ عن تلك الموجودة في المجموعات والقوائم لضمان تمييز واضح. في الواقع ، غالبًا ما يكون غير بديهي وغير مقصود أن تمر السلاسل للتسلسل ، كما يتضح من الأسئلة والشكاوى المنتظمة. لذلك لا تتم مطابقة السلاسل والبايت بنمط تسلسلي ، مما يحد من نمط التسلسل لفهم محدد للغاية لـ "التسلسل". المدمج في bytearray النوع ، كونه نسخة قابلة للتغيير من بايت، يستحق أيضًا استثناءً ولكننا لا ننوي تعداد جميع الأنواع الأخرى التي يمكن استخدامها لتمثيل وحدات البايت (على سبيل المثال ، بعض ، وليس كل ، حالات عرض ذاكرة و صفيف).

أنماط التعيين

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

يعكس نمط التعيين الاستخدام الشائع للبحث في القاموس: فهو يسمح للمستخدم باستخراج بعض القيم من التعيين عن طريق مفاتيح ثابتة / معروفة وتتطابق القيم مع أنماط فرعية معينة. يتم تجاهل المفاتيح الإضافية في الموضوع حتى لو **راحة غير موجود. هذا يختلف عن أنماط التسلسل ، حيث ستؤدي العناصر الإضافية إلى فشل التطابق. لكن التعيينات تختلف في الواقع عن التسلسلات: فهي تتمتع بسلوك كتابة فرعي هيكلي طبيعي ، أي أن تمرير قاموس بمفاتيح إضافية في مكان ما سيعمل على الأرجح. إذا كان من الضروري فرض حد أعلى على التعيين والتأكد من عدم وجود مفاتيح إضافية ، فإن نمط النجمة المزدوجة المعتاد **راحة يمكن استعماله. الحالة الخاصة **_ مع حرف بدل ، ومع ذلك ، لا يتم دعمه لأنه لن يكون له أي تأثير ، ولكنه قد يؤدي إلى فهم غير صحيح لدلالات نمط التعيين.

لتجنب خوارزميات المطابقة الباهظة الثمن ، يجب أن تكون المفاتيح حرفية أو أنماط قيمة.

هناك سبب خفي لاستخدام الحصول على (مفتاح ، افتراضي) بدلا من __getitem __ (مفتاح) متبوعًا بشيك لـ خطأ في السمة: إذا كان الموضوع هو ملف الافتراضي، داعيا __تحصل على البند__ لمفتاح غير موجود من شأنه أن يضيف المفتاح. استخدام احصل على() يتجنب هذا التأثير الجانبي غير المتوقع.

مثال باستخدام نمط التعيين:

أنماط الطبقة

تحقق أنماط الفصل غرضين: التحقق مما إذا كان موضوع معين هو بالفعل مثيل لفئة معينة ، واستخراج البيانات من سمات محددة للموضوع. كشفت الأدلة القصصية ذلك isinstance () هي إحدى الوظائف الأكثر استخدامًا في Python من حيث التكرار الثابت في البرامج. عادةً ما تسبق عمليات التحقق من المثيل هذه الوصول اللاحق إلى المعلومات المخزنة في الكائن ، أو إمكانية التلاعب بها. قد يكون النمط النموذجي على غرار ما يلي:

في كثير من الحالات ، تحدث أنماط الفصل متداخلة ، كما في المثال الوارد في الدافع:

يتيح لك نمط الفئة تحديد كلٍ من فحص المثيل والسمات ذات الصلة بإيجاز (مع قيود إضافية محتملة). وبالتالي ، من المغري جدًا أن تكتب ، على سبيل المثال ، عقدة الحالة (يسار ، يمين): في الحالة الأولى أعلاه و حالة ورقة (القيمة): في الثانية. في حين أن هذا يعمل جيدًا بالفعل مع اللغات ذات أنواع البيانات الجبرية الصارمة ، إلا أنه يمثل مشكلة في بنية كائنات Python.

عند التعامل مع كائنات Python العامة ، فإننا نواجه عددًا كبيرًا جدًا من السمات غير المرتبة: مثيل العقدة يحتوي على عدد كبير من السمات (معظمها "طرق خاصة" مثل __إعداد__). علاوة على ذلك ، لا يمكن للمترجم الفوري أن يستنتج بشكل موثوق ترتيب السمات. بالنسبة للكائن الذي يمثل دائرة ، على سبيل المثال ، لا يوجد ترتيب واضح بطبيعته للسمات x, ذ و نصف القطر.

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

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

سيتم استخدام تسمية السمات المعنية بشكل صريح في الغالب للحالات الأكثر تعقيدًا حيث يكون الشكل الموضعي (أدناه) غير كافٍ.

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

هذه سمة فئة ، لأنها تحتاج إلى البحث عن الفئة المسماة في نمط الفصل ، وليس على مثيل الموضوع.

يعتمد بناء جملة أنماط الفصل على فكرة أن إزالة البناء تعكس بناء جملة البناء. هذا هو الحال بالفعل في أي بنية Python تقريبًا ، سواء كانت أهداف تخصيص أو تعريفات للوظائف أو تفريغ متكرر. في جميع هذه الحالات ، نجد أن بناء الجملة الخاص بالإرسال وتلك الخاصة بتلقي "البيانات" متطابقان تقريبًا.

  • أهداف التعيين مثل المتغيرات والسمات والنصوص: foo.bar [2] = foo.bar [3]
  • تعريفات الوظيفة: دالة معرّفة بـ def foo (x، y، z = 6) يسمى ، على سبيل المثال ، foo (123 ، ص = 45)، حيث يتم مطابقة الحجج الفعلية المقدمة في موقع الاستدعاء مع المعلمات الرسمية في موقع التعريف
  • التفريغ المتكرر: أ ، ب = ب ، أ أو [أ ، ب] = [ب ، أ] أو (أ ، ب) = (ب ، أ)، على سبيل المثال لا الحصر الاحتمالات المكافئة.

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

الحالة الخاصة للفئات المدمجة منطقي, bytearray إلخ (حيث على سبيل المثال شارع (x) يلتقط قيمة الموضوع في x) بواسطة فئة معرّفة من قبل المستخدم على النحو التالي:

اكتب التعليقات التوضيحية لمتغيرات النمط. كان الاقتراح هو دمج الأنماط مع التعليقات التوضيحية من النوع:

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


شاهد الفيديو: 19 الذكاء الاصطناعي. أنظمة خبيرة عملي بالبايثون Expert Systems with Python