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 đó.
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
7 là số bắt đầu chứ không phảiclass 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 AutoNumber[Enum]: def __new__[cls]: value = len[cls.__members__] # note no + 1 obj = object.__new__[cls] obj._value_ = value return obj
1 theo nghĩa boolean, nhưng tất cả các thành viên enum đều đánh giá thànhclass Color[AutoNumber]: red = [] green = [] blue = []
2.class Color[AutoNumber]: red = [] green = [] blue = []
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
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]
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
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
7:the way it does this is an implementation detail and may change.class AutoNumber[Enum]: def __new__[cls]: value = len[cls.__members__] # note no + 1 obj = object.__new__[cls] obj._value_ = value return obj
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]
5class Color[AutoNumber]:
red = []
green = []
blue = []
Đã trả lời ngày 22 tháng 12 năm 2016 lúc 20:20
orange = [255, 102, 0]
print[orange[PrimaryColours.GREEN]]
7class Color[AutoNumber]:
red = []
green = []
blue = []
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ácclass AutoNumber[Enum]:
def __new__[cls]:
value = len[cls.__members__] # note no + 1
obj = object.__new__[cls]
obj._value_ = value
return obj
0Như 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
15.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
2OP đã 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
3Lư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
4sẽ dẫn đến:Nov 15 at 15:17