enum - dizge dönüşümünde enum değerini alma


113

Aşağıdaki numaralandırma tanımladım

from enum import Enum


class D(Enum):
    x = 1
    y = 2


print(D.x)

şimdi basılı değer

D.x

bunun yerine numaralandırmanın değerinin yazdırılmasını istedim

1

Bu işlevselliği elde etmek için ne yapılabilir?


1
Erişim parametrelerini açıklığa kavuşturmalıyım, Dxvalue şeyini biliyorum, istediğim değeri döndürmek için Dx string dönüşümü, eğer soru durumu netleştirmiyorsa özür dilerim.
Vaibhav Mishra

Yanıtlar:


193

Enum nesnesini yazdırıyorsunuz . .valueÖzniteliği yalnızca bunu yazdırmak istiyorsanız kullanın :

print(D.x.value)

Bkz numaralandırma üyeleri ve nitelikleri programlı erişim bölümünde :

Bir sıralama üyeniz varsa ve adına veya değerine ihtiyacınız varsa:

>>>
>>> member = Color.red
>>> member.name
'red'
>>> member.value
1

Tek __str__istediğiniz özel bir dize temsili sağlamaksa, numaranıza bir yöntem ekleyebilirsiniz :

class D(Enum):
    def __str__(self):
        return str(self.value)

    x = 1
    y = 2

Demo:

>>> from enum import Enum
>>> class D(Enum):
...     def __str__(self):
...         return str(self.value)
...     x = 1
...     y = 2
... 
>>> D.x
<D.x: 1>
>>> print(D.x)
1

Onu bir tamsayı değeriyle karşılaştırdığımda nesne olarak dönüyor. Ör: if D.x == 10: .... Tamsayılar için nasıl bir yaklaşım benimsemeliyim?
alper

@alper: tamamen aynı şekilde; D.xenum nesnesidir, D.x.valuebir tamsayı değeridir. Eğer enum değerleri tamsayılar gibi hareket olması gerekiyorsa, kullanmak IntEnumtürü her öğe bir alt sınıfıdır, intve bu yüzden IntEnumD.x == 10çalışacak.
Martijn Pieters

Eklediğim def __eq__(self, other): return int(self.value) == otherve def __int__(self): return int(self.value)ama yine ben kullanmak zorunda düşünüyorum .valueben karşılaştırarak kullanmadığınızda durumlar hakkında
alper

@alper: başka bir enum değeri __eq__olduğunda bu uygulama çalışmaz other; D.x == D.y, D.x.value == D.y.valueörneğin doğru olduğu yerde başarısız olur. Orası IntEnumyerine kullanmak istiyormuşsun gibi geliyor Enum.
Martijn Pieters

8

Aşağıdakileri kullanarak erişim sağladım

class D(Enum):
    x = 1
    y = 2

    def __str__(self):
        return '%s' % self.value

şimdi yapabilirim

print(D.x)1sonuç olarak almak için .

Bunun yerine self.nameyazdırmak istemeniz durumunda da kullanabilirsiniz .x1


2
Neden dize biçimlendirmesi ve self._value_? return str(self.value)daha basittir.
Martijn Pieters

1
Sadece kaynağa baktım ve bu nasıl uygulanıyor, ancak siz haklısınız ve self.valuedaha temiz.
Vaibhav Mishra

3
Tek alt çizgi öznitelikleri, oluşturulan enum sınıfının içindedir; belgelenmiş niteliğe daha iyi sadık kalın (ki bu özel bir tanımlayıcıdır, böylece valuenumaralandırma türünüzde hala bir ad olarak kullanabilirsiniz ).
Martijn Pieters

@MartijnPieters kabul etti
Vaibhav Mishra

0

EnumBir dize kullanarak erişim ararken bu sayfayı buldum . Bu özel soruda sorulan şeyin bu olmadığını biliyorum, ancak başlık bunu 'öneriyor'.

Bir String kullanarak bir Enum almak için aşağıdakileri yapabilirsiniz:

from enum import Enum


class D(Enum):
    x = 1
    y = 2


print(D["x"])  # <D.x: 1>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.