Python Enum列舉的實現

2021-08-21 19:02:10 字數 1944 閱讀 1045

python: enum列舉的實現

從c系語言過來用python,好不容易適應了寫**不打花括號,突然有一天發現它居然木有列舉……於是stackoverflow了一把,發現神人的列舉(enum)實現到處都是,於是漢化總結過來。

如果是新版python使用者(python 3.4 with pep 435):

from enum import enum

animal = enum('animal', 'ant bee cat dog')

or

class animals(enum):

ant = 1

bee = 2

cat = 3

dog = 4

舊版python使用者可以充分發揮動態語言的優越性來構造列舉,有簡單的:

def enum(**enums):

return type('enum', (), enums)

numbers = enum(one=1, two=2, three='three')

# numbers.one == 1, numbers.two == 2 and numbers.three == 'three'

有複雜的:

def enum(*sequential, **named):

enums = dict(zip(sequential, range(len(sequential))), **named)

return type('enum', (), enums)

numbers = enum('zero', 'one', 'two')

# numbers.zero == 0 and numbers.one == 1

有帶值到名稱對映的:

有用set實現的:

class enum(set):

def __getattr__(self, name):

if name in self:

return name

raise attributeerror

animals = enum(["dog", "cat", "horse"])

print animals.dog

有用range實現的:

dog, cat, rabbit = range(3)

# or

class stationary:

(pen, pencil, eraser) = range(0, 3)

print stationary.pen

有用tuple實現的:

class enum(tuple): __getattr__ = tuple.index

state = enum(['unclaimed', 'claimed'])

print state.claimed

有用namedtuple實現的:

from collections import namedtuple

def enum(*keys):

return namedtuple('enum', keys)(*keys)

myenum = enum('foo', 'bar', 'baz')

# 帶字元數字對映的,像c/c++

def enum(*keys):

return namedtuple('enum', keys)(*range(len(keys)))

# 帶字典對映的,可以對映出各種型別,不侷限於數字

def enum(**kwargs):

return namedtuple('enum', kwargs.keys())(*kwargs.values())

python: enum列舉的實現

MPI 列舉排序實現

dfdfdfssfd.cpp 定義控制台應用程式的入口點。include stdafx.h include stdlib.h include stdio.h include mpi.h void countrank int rank,int perlen,int len,int p,int tota...

可空列舉的實現方法

可空列舉 在使用列舉的時候的,經常希望可以對列舉賦值為null,或者清空列舉值。但是常用的列舉,就是固定的幾項。而且不能對值型別賦值為null。如何來實現可空列舉?要求保留到資料庫中的值,需要為null。這種情況在業務開發中經常出現。儘管問題較小,但是可以 下解決方案,找到一種最優解。方法1 將儲存...

列舉的其他應用 實現介面

列舉可以跟其他類一樣實現介面,但是要求實現介面的時候,要求列舉中的每個物件都必須單獨覆寫好介面中的抽象方法。package 類集 inte ce print enum color implements print green blue public abstract string getcolor ...