كيف يجب أن الأفضل الاقتداء و/أو تجنب التعداد في الثعبان ؟ [مكررة]

StackOverflow https://stackoverflow.com/questions/108523

  •  01-07-2019
  •  | 
  •  

سؤال

هذا السؤال سبق الجواب هنا:

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

رمز الفئة هنا:

class Enum(object):
'''Simple Enum Class
Example Usage:
>>> codes = Enum('FOO BAR BAZ') # codes.BAZ will be 2 and so on ...'''
def __init__(self, names):
    for number, name in enumerate(names.split()):
        setattr(self, name, number)
هل كانت مفيدة؟

المحلول

هناك الكثير من النقاش هنا.

نصائح أخرى

Enums تم اقتراح إدراج في اللغة من قبل ، ولكن تم رفض (انظر http://www.python.org/dev/peps/pep-0354/) ، على الرغم من وجود حزم يمكنك استخدام بدلا من الكتابة الخاصة بك التنفيذ:

الأكثر شيوعا التعداد القضية المذكورة القيم التي هي جزء من الدولة أو استراتيجية تصميم نمط.على enums هي دول معينة أو محددة اختياري الاستراتيجيات المستخدمة.في هذه الحالة, أنهم دائما تقريبا جزءا لا يتجزأ من بعض تعريف الفئة

class DoTheNeedful( object ):
    ONE_CHOICE = 1
    ANOTHER_CHOICE = 2 
    YET_ANOTHER = 99
    def __init__( self, aSelection ):
        assert aSelection in ( self.ONE_CHOICE, self.ANOTHER_CHOICE, self.YET_ANOTHER )
        self.selection= aSelection

ثم في عميل من هذه الفئة.

dtn = DoTheNeeful( DoTheNeeful.ONE_CHOICE )

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

FOO_BAR = 'FOO_BAR'
FOO_BAZ = 'FOO_BAZ'
FOO_QUX = 'FOO_QUX'

و في وقت لاحق...

if something is FOO_BAR: pass # do something here
elif something is FOO_BAZ: pass # do something else
elif something is FOO_QUX: pass # do something else
else: raise Exception('Invalid value for something')

لاحظ أن استخدام is بدلا من == هو مخاطرة هنا يفترض أن الناس تستخدم your_module.FOO_BAR بدلا من السلسلة 'FOO_BAR' (والتي سوف عادة يكون داخليا مثل أن is ستكون مباراة, ولكن هذا بالتأكيد لا يمكن الاعتماد عليها) و لذلك قد لا يكون من المناسب اعتمادا على السياق.

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

وبالاضافة الى ذلك, الشيء الآخر أن يسيء لي Pythonic الحساسيات إعادة الطبقة تقترح هو استخدام split().لماذا لا تمر فقط في tuple ، قائمة أو أخرى enumerable ؟

مدمج طريقة للقيام enums هو:

(FOO, BAR, BAZ) = range(3)

الذي يعمل بشكل جيد بالنسبة مجموعات صغيرة ، ولكن لديه بعض السلبيات:

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

لاستكمال تنفيذ التعداد في بيثون ، انظر:http://code.activestate.com/recipes/67107/

بدأت مع ما يشبه S. لوت الجواب ولكن أنا فقط من طاقتها 'شارع' و 'eq' (بدلا من كل فئة كائن) حتى أتمكن من طباعة ومقارنة التعداد قيمة.

class enumSeason():
    Spring = 0
    Summer = 1
    Fall = 2
    Winter = 3
    def __init__(self, Type):
        self.value = Type
    def __str__(self):
        if self.value == enumSeason.Spring:
            return 'Spring'
        if self.value == enumSeason.Summer:
            return 'Summer'
        if self.value == enumSeason.Fall:
            return 'Fall'
        if self.value == enumSeason.Winter:
            return 'Winter'
    def __eq__(self,y):
        return self.value==y.value

طباعة(x) سوف تسفر عن اسم بدلا من القيمة قيمتين عقد الربيع سوف يكون على قدم المساواة إلى واحد آخر.

   >>> x = enumSeason(enumSeason.Spring)
   >>> print(x)
   Spring
   >>> y = enumSeason(enumSeason.Spring)
   >>> x == y
   True
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top