Hướng dẫn python enum auto start from 0 - python enum tự động bắt đầu từ 0

Có cách nào tốt hơn để tạo ra một danh sách dài các liệt kê với tự động đánh số bắt đầu từ 0 không? Gần nhất mà tôi có thể tìm thấy là:

class Color(Enum):
    red, green, blue=range(3)

Tuy nhiên, cách tiếp cận trên đòi hỏi phải biết tổng số các mục trong bảng liệt kê trước đó.

Hướng dẫn python enum auto start from 0 - python enum tự động bắt đầu từ 0

Jonrsharpe

Huy hiệu vàng 111K2525 gold badges218 silver badges403 bronze badges

Hỏi ngày 22 tháng 12 năm 2016 lúc 20:04Dec 22, 2016 at 20:04

8

Tài liệu cung cấp một công thức cho việc tự động hóa có thể dễ dàng điều chỉnh để bắt đầu từ 0:

class AutoNumber(Enum):
     def __new__(cls):
        value = len(cls.__members__)  # note no + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj

Sau đó, bạn có thể tạo nó với các thành viên tùy ý:

class Color(AutoNumber):
    red = ()
    green = ()
    blue = ()

Ngoài ra, lưu ý rằng API chức năng có thể lấy một cặp có giá trị khóa:

from itertools import count

Color = Enum('Color', zip(['red', 'green', 'blue'], count()))

class AutoNumber(Enum):
     def __new__(cls):
        value = len(cls.__members__)  # note no + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj
5 về cơ bản là tương đương kết thúc mở của
class AutoNumber(Enum):
     def __new__(cls):
        value = len(cls.__members__)  # note no + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj
6.


Tuy nhiên, các tài liệu cũng cung cấp lý do cho các thành viên thường bắt đầu với

class AutoNumber(Enum):
     def __new__(cls):
        value = len(cls.__members__)  # note no + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj
7:

Lý do mặc định đến

class AutoNumber(Enum):
     def __new__(cls):
        value = len(cls.__members__)  # note no + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj
7 là số bắt đầu chứ không phải
class AutoNumber(Enum):
     def __new__(cls):
        value = len(cls.__members__)  # note no + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj
9 là
class AutoNumber(Enum):
     def __new__(cls):
        value = len(cls.__members__)  # note no + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj
9 là
class Color(AutoNumber):
    red = ()
    green = ()
    blue = ()
1 theo nghĩa boolean, nhưng tất cả các thành viên enum đều đánh giá thành
class Color(AutoNumber):
    red = ()
    green = ()
    blue = ()
2.

Bắt đầu từ 0 có thể dẫn đến hành vi khó hiểu sau này.

Đã trả lời ngày 22 tháng 12 năm 2016 lúc 20:20Dec 22, 2016 at 20:20

Hướng dẫn python enum auto start from 0 - python enum tự động bắt đầu từ 0

Jonrsharpejonrsharpejonrsharpe

Huy hiệu vàng 111K2525 gold badges218 silver badges403 bronze badges

3

Hỏi ngày 22 tháng 12 năm 2016 lúc 20:04

Color = Enum('Color', ['RED', 'GREEN', 'BLUE'])

Tài liệu cung cấp một công thức cho việc tự động hóa có thể dễ dàng điều chỉnh để bắt đầu từ 0:

Sau đó, bạn có thể tạo nó với các thành viên tùy ý:

Ngoài ra, lưu ý rằng API chức năng có thể lấy một cặp có giá trị khóa:

class AutoNumber(Enum):
     def __new__(cls):
        value = len(cls.__members__)  # note no + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj
5 về cơ bản là tương đương kết thúc mở của
class AutoNumber(Enum):
     def __new__(cls):
        value = len(cls.__members__)  # note no + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj
6.

Color = Enum('Color', ['RED', 'GREEN', 'BLUE'], start=0)

Hướng dẫn python enum auto start from 0 - python enum tự động bắt đầu từ 0

Jonrsharpe

Huy hiệu vàng 111K2525 gold badges218 silver badges403 bronze badges

Hỏi ngày 22 tháng 12 năm 2016 lúc 20:04Jan 30, 2020 at 9:02

Hướng dẫn python enum auto start from 0 - python enum tự động bắt đầu từ 0

Tài liệu cung cấp một công thức cho việc tự động hóa có thể dễ dàng điều chỉnh để bắt đầu từ 0:Spenhouet

Sau đó, bạn có thể tạo nó với các thành viên tùy ý:10 gold badges48 silver badges70 bronze badges

Ngoài ra, lưu ý rằng API chức năng có thể lấy một cặp có giá trị khóa:

class AutoNumber(Enum):
     def __new__(cls):
        value = len(cls.__members__)  # note no + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj
5 về cơ bản là tương đương kết thúc mở của
class AutoNumber(Enum):
     def __new__(cls):
        value = len(cls.__members__)  # note no + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj
6.

Tuy nhiên, các tài liệu cũng cung cấp lý do cho các thành viên thường bắt đầu với

class AutoNumber(Enum):
     def __new__(cls):
        value = len(cls.__members__)  # note no + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj
7:the way it does this is an implementation detail and may change.

Lý do mặc định đến

class AutoNumber(Enum):
     def __new__(cls):
        value = len(cls.__members__)  # note no + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj
7 là số bắt đầu chứ không phải
class AutoNumber(Enum):
     def __new__(cls):
        value = len(cls.__members__)  # note no + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj
9 là
class AutoNumber(Enum):
     def __new__(cls):
        value = len(cls.__members__)  # note no + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj
9 là
class Color(AutoNumber):
    red = ()
    green = ()
    blue = ()
1 theo nghĩa boolean, nhưng tất cả các thành viên enum đều đánh giá thành
class Color(AutoNumber):
    red = ()
    green = ()
    blue = ()
2.

from enum import IntEnum, auto
class PrimaryColours(IntEnum):
    def _generate_next_value_(name, start, count, last_values):
        """generate consecutive automatic numbers starting from zero"""
        return count

    RED = auto()
    GREEN = auto()
    BLUE = auto()

Bắt đầu từ 0 có thể dẫn đến hành vi khó hiểu sau này.

print(PrimaryColours.RED.value,
      PrimaryColours.GREEN.value,
      PrimaryColours.BLUE.value)

class Color(AutoNumber):
    red = ()
    green = ()
    blue = ()
5

Đã trả lời ngày 22 tháng 12 năm 2016 lúc 20:20

orange = (255, 102, 0)
print(orange[PrimaryColours.GREEN])

class Color(AutoNumber):
    red = ()
    green = ()
    blue = ()
7

JonrsharpejonrsharpeApr 26, 2020 at 8:47

Như @jonrsharpe đã hiển thị, một enum có thể được tạo như thế này:Martin CR

Điều này sẽ được lập chỉ mục (bắt đầu) bởi 1.12 silver badges22 bronze badges

13

Tài liệu chính thức nêu rõ, từ Python 3.5:

from enum import Enum, auto

class MyEnum(Enum):
    FIELD_1 = 0
    FIELD_2 = auto()
    FIELD_3 = auto()

print(list(MyEnum))

Sử dụng tham số

class Color(AutoNumber):
    red = ()
    green = ()
    blue = ()
3 để chỉ định giá trị bắt đầu khác

class AutoNumber(Enum):
     def __new__(cls):
        value = len(cls.__members__)  # note no + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj
0

Như tài liệu nêu rõ, bạn có thể làm chính xác điều đó:

Đã trả lời ngày 30 tháng 1 năm 2020 lúc 9:02Dec 23, 2020 at 11:38

Spenhouetspenhouet

class AutoNumber(Enum):
     def __new__(cls):
        value = len(cls.__members__)  # note no + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj
1

5.91810 Huy hiệu vàng48 Huy hiệu bạc70 Huy hiệu đồng

class AutoNumber(Enum):
     def __new__(cls):
        value = len(cls.__members__)  # note no + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj
2

OP đã làm rõ rằng động lực của họ là sử dụng giá trị enum làm chỉ số mảng, ngụ ý đánh số liên tiếp bắt đầu từ 0.Jul 29, 2020 at 14:20

Tài liệu nêu rõ:Vinzent

Mục tiêu của các phương thức [tự động hóa] mặc định là cung cấp int tiếp theo theo trình tự với int cuối cùng được cung cấp, nhưng cách nó thực hiện đây là một chi tiết triển khai và có thể thay đổi.1 gold badge7 silver badges12 bronze badges

1

Do đó, có thể là khôn ngoan khi xác định phương pháp tự động hóa một cách rõ ràng, ví dụ:

Điều này sẽ đảm bảo rằng các giá trị

class Color(AutoNumber):
    red = ()
    green = ()
    blue = ()
4 được gán các giá trị ConsequTy bắt đầu từ 0:

class AutoNumber(Enum):
     def __new__(cls):
        value = len(cls.__members__)  # note no + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj
3

Lưu ý rằng thuộc tính

class Color(AutoNumber):
    red = ()
    green = ()
    blue = ()
6 có thể bị bỏ qua nếu bối cảnh không yêu cầu, ví dụ:

Đã trả lời ngày 26 tháng 4 năm 2020 lúc 8:47Sep 8 at 4:44

Martin Crmartin crtoto

1.08012 Huy hiệu bạc22 Huy hiệu đồng1 silver badge6 bronze badges

Nếu bạn thích tuyên bố một lớp học theo cách cũ, trong Python

class Color(AutoNumber):
    red = ()
    green = ()
    blue = ()
8, bạn có thể thử một cái gì đó như thế này:

class AutoNumber(Enum):
     def __new__(cls):
        value = len(cls.__members__)  # note no + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj
4

sẽ dẫn đến:Nov 15 at 15:17

Python có thể bắt đầu bắt đầu 0 không?

Tái tạo với một chỉ mục bắt đầu khác để bạn biết, các chỉ số trong Python bắt đầu ở 0. Điều này có nghĩa là khi bạn sử dụng hàm liệt kê, chỉ mục được trả về cho mục đầu tiên sẽ là 0.indices in python start at 0. This means that when you use the enumerate function, the index returned for the first item will be 0.

Auto () trong python enum là gì?

Mô -đun enum của Python cung cấp một hàm thuận tiện gọi là auto () cho phép bạn đặt các giá trị tự động cho các thành viên enum của bạn.Hành vi mặc định của hàm này là gán các giá trị số nguyên liên tiếp cho các thành viên.Bạn cần gọi Auto () một lần cho mỗi giá trị tự động mà bạn cần.allows you to set automatic values for your enum members. This function's default behavior is to assign consecutive integer values to members. You need to call auto() once for each automatic value that you need.

Tôi có nên sử dụng Enum trong Python không?

Các enum Python rất hữu ích để đại diện cho dữ liệu đại diện cho một tập hợp các trạng thái hữu hạn như ngày trong tuần, tháng trong năm, v.v. Chúng đã được thêm vào Python 3.4 qua PEP 435. Tuy nhiên, nó có sẵn tất cả các cách trở lại 2.4 thông quapypy.Như vậy, bạn có thể mong đợi chúng là một yếu tố chính khi bạn khám phá lập trình Python. such as days of the week, months of the year, etc. They were added to Python 3.4 via PEP 435. However, it is available all the way back to 2.4 via pypy. As such, you can expect them to be a staple as you explore Python programming.

Có nên viết hoa không?

Bởi vì chúng là hằng số, tên của các trường của một loại enum nằm trong các chữ cái viết hoa.Bạn nên sử dụng các loại Enum bất cứ khi nào bạn cần đại diện cho một tập hợp các hằng số cố định.the names of an enum type's fields are in uppercase letters. You should use enum types any time you need to represent a fixed set of constants.