سؤال

في Python 2.6 (والإصدارات الأقدم) تم استخدام hex() و oct() يمكن تحميل الوظائف المضمنة بشكل زائد في الفصل من خلال تحديد __hex__ و __oct__ وظائف خاصة.ومع ذلك لا يوجد __bin__ وظيفة خاصة لزيادة التحميل على سلوك Python 2.6 الجديد bin() وظيفة مدمجة.

أريد أن أعرف ما إذا كان هناك أي طريقة للتحميل الزائد بمرونة bin(), وإذا لم يكن الأمر كذلك كنت أتساءل لماذا الواجهة غير المتناسقة؟

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

>>> a = BitString(length=12)       # Twelve zero bits
>>> hex(a)
'0x000'
>>> oct(a)
'0o0000'
>>> bin(a)
'0b0' <------ I want it to output '0b000000000000'

أظن أنه لا توجد طريقة لتحقيق ذلك، لكنني اعتقدت أنه لن يضر السؤال!

هل كانت مفيدة؟

المحلول 2

وأعتقد أن الإجابة المختصرة هي "لا، bin() لا يمكن طاقتها مثل oct() وhex()".

وأما لماذا، والجواب يجب أن تكذب مع بيثون 3.0، والذي يستخدم __index__ الزائد hex()، oct() وbin()، وتمت إزالة __oct__ و__hex__ وظائف خاصة تماما.

وهكذا bin() بيثون 2.6 تبدو الى حد كبير مثل ذلك حقا بيثون 3.0 الميزة التي كانت العودة استدار دون اعتبار يذكر أنه يفعل أشياء جديدة وطريقة بيثون 3 بدلا من القديمة الطريق بايثون 2. كنت أيضا أعتقد أنه من غير المحتمل أن يحصل ثابتة، حتى لو أنه يعتبر أن يكون خطأ.

نصائح أخرى

وكما اكتشفت بالفعل، لا يمكنك التجاوز bin(), ، ولكن لا يبدو أنك بحاجة إلى القيام بذلك.أنت فقط تريد قيمة ثنائية مبطنة 0.لسوء الحظ في python 2.5 والإصدارات السابقة، لا يمكنك استخدام "%b" للإشارة إلى الملف الثنائي، لذلك لا يمكنك استخدام عامل تنسيق السلسلة "%" لتحقيق النتيجة التي تريدها.

لحسن الحظ، يقدم الإصدار python 2.6 ما تريد، في شكل الجديد تنسيق str () طريقة.أعتقد أن هذا الجزء المحدد من ضجيج الخط هو ما تبحث عنه:

>>> '{0:010b}'.format(19)
'0000010011'

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

  1. المعلمة صفر (أي 19) يجب أن يتم تنسيقه باستخدام
  2. سحر "0" للإشارة إلى أنني أريد رقمًا مبطنًا بمحاذاة اليمين مع 0
  3. 10 أرقام من الدقة، في
  4. تنسيق ثنائي.

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

وتستقبل وظيفة بن انها قيمة من وظيفة __index__ الكائن. لذلك لكائن، يمكنك تحديد قيمة تحويلها إلى ثنائي، ولكن لا يمكنك تحديد شكل سلسلة.

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

def mybin(n):
    try:
        return n.__bin__()
    except AttributeError:
        return bin(n)

أما سبب التناقض في الواجهة فلست متأكدا.ربما يرجع السبب في ذلك إلى إضافة bin() مؤخرًا، لذا فهي سهو بسيط؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top