Nó có phải là một con trăn có thể lặp lại không?

Một phép liệt kê là một tập hợp các tên tượng trưng được liên kết với các giá trị không đổi, duy nhất. Trong một phép liệt kê, các giá trị có thể được so sánh theo danh tính và bản thân phép liệt kê có thể được lặp lại. Các giá trị cơ bản có thể được lấy từ các mục liệt kê. Một biến thể dựa trên số nguyên được cung cấp cho phép các mục được sử dụng dưới dạng lát cắt, để tương tác với các API dựa trên C và cho các hoạt động logic

Động lực¶

[Được nâng cấp từ PEP 354 - PEP liệt kê ban đầu bị từ chối]

Các thuộc tính của một phép liệt kê rất hữu ích để xác định một tập hợp các giá trị không thay đổi, có liên quan, có một chuỗi xác định nhưng không có ý nghĩa ngữ nghĩa vốn có. Ví dụ điển hình là các ngày trong tuần [Chủ Nhật đến Thứ Bảy] và điểm đánh giá của trường ['A' đến 'D' và 'F']. Các ví dụ khác bao gồm các giá trị và trạng thái trạng thái lỗi trong một quy trình xác định

Có thể chỉ cần xác định một chuỗi giá trị của một số loại cơ bản khác, chẳng hạn như int hoặc str , để biểu thị các giá trị tùy ý rời rạc. Tuy nhiên, một phép liệt kê đảm bảo rằng các giá trị đó khác biệt với bất kỳ giá trị nào khác và các phép toán không có ý nghĩa ["thứ tư lần hai"] không được xác định cho các giá trị này.

Tạo bảng liệt kê¶

Cú pháp lớp¶

Có thể tạo các bảng liệt kê bằng cách sử dụng cú pháp lớp, giúp chúng dễ đọc và dễ viết. Mỗi giá trị liệt kê phải có một giá trị duy nhất và hạn chế duy nhất đối với tên của chúng là chúng phải là mã định danh Python hợp lệ. Để xác định một kiểu liệt kê, hãy lấy từ lớp Enum và thêm các thuộc tính với phép gán cho các giá trị của chúng. Các giá trị không được trùng lặp.

>>> from flufl.enum import Enum
>>> class Colors[Enum]:
..     red = 1
..     green = 2
..     blue = 3

Các giá trị liệt kê có các biểu diễn chuỗi đẹp, con người có thể đọc được

>>> print[Colors.red]
Colors.red

Các đại diện có thêm thông tin chi tiết.

>>> print[repr[Colors.red]]

Phép liệt kê số nguyên¶

Một lớp con đặc biệt của Enum có thể được sử dụng khi các giá trị liệt kê cần hoạt động như số nguyên. Trên thực tế, các giá trị trong lớp IntEnum này là số nguyên và có thể được sử dụng ở bất kỳ nơi nào cần sử dụng số nguyên, kể cả khi giao tiếp với API C.

>>> from flufl.enum import IntEnum
>>> class Animals[IntEnum]:
..     ant = 1
..     bee = 2
..     cat = 3

Các giá trị liệt kê này có thể được chuyển đổi thành số nguyên

>>> int[Animals.bee]
2

Các giá trị liệt kê này cũng có thể được sử dụng làm chỉ mục lát cắt

>>> list[range[10][Animals.ant:Animals.cat]]
[1, 2]

API tiện lợi¶

Để thuận tiện, bạn có thể tạo một phép liệt kê bằng cách gọi lớp Enum . Đối số đầu tiên là tên của kiểu liệt kê mới và đối số thứ hai cung cấp các giá trị kiểu liệt kê. Có một số cách để chỉ định các giá trị – xem phần API chức năng để biết chi tiết – nhưng cách dễ nhất là cung cấp một chuỗi tên thuộc tính được phân tách bằng dấu cách. Các giá trị là số nguyên được gán tự động bắt đầu từ 1.

>>> Rush = Enum['Rush', 'geddy alex neil']

The strrepr cung cấp thông tin chi tiết.

>>> print[Rush.geddy]
Rush.geddy
>>> print[repr[Rush.geddy]]

Xem phần về API chức năng để biết thêm tùy chọn và thông tin

Giá trị¶

Các mục liệt kê có thể có bất kỳ giá trị nào bạn chọn, nhưng thông thường chúng sẽ là giá trị số nguyên hoặc chuỗi

________số 8

Kiểm tra bảng liệt kê¶

Tên giá trị liệt kê có sẵn thông qua các thành viên lớp

>>> for member in Colors.__members__:
..     print[member]
red
green
blue

str và repr của lớp liệt kê cũng cung cấp thông tin hữu ích

>>> print[Colors.red]
Colors.red
0

Giả sử bạn muốn mã hóa một giá trị liệt kê trong cơ sở dữ liệu. Bạn có thể muốn lấy đối tượng lớp liệt kê từ một giá trị liệt kê

>>> print[Colors.red]
Colors.red
1

Bảng liệt kê cũng có một thuộc tính chỉ chứa tên mục của chúng

>>> print[Colors.red]
Colors.red
2

Giá trị mục cơ bản cũng có thể được truy xuất thông qua . giá trị thuộc tính.

>>> print[Colors.red]
Colors.red
3

Các phép liệt kê số nguyên cũng có thể được chuyển đổi rõ ràng thành giá trị số nguyên của chúng bằng cách sử dụng int[] tích hợp sẵn.

>>> print[Colors.red]
Colors.red
4

So sánh¶

Các giá trị liệt kê được so sánh theo danh tính

>>> print[Colors.red]
Colors.red
5

Bảng liệt kê tiêu chuẩn¶

Lớp Enum tiêu chuẩn không so sánh với các giá trị số nguyên tương đương, bởi vì nếu bạn xác định một phép liệt kê có tên mục và giá trị số nguyên tương tự , chúng sẽ không giống nhau.

>>> print[Colors.red]
Colors.red
6

Các giá trị liệt kê này không bằng nhau, chúng cũng không băm bằng nhau

>>> print[Colors.red]
Colors.red
7

So sánh theo thứ tự giữa các giá trị liệt kê không được hỗ trợ. Các giá trị liệt kê cơ sở không phải là số nguyên

>>> print[Colors.red]
Colors.red
8

So sánh bình đẳng được xác định mặc dù

>>> print[Colors.red]
Colors.red
9

Giá trị liệt kê không hỗ trợ so sánh theo thứ tự

>>> print[repr[Colors.red]]

0

Mặc dù cho phép so sánh bằng, nhưng so sánh với các giá trị không liệt kê sẽ luôn so sánh không bằng

>>> print[repr[Colors.red]]

1

Kiểu liệt kê số nguyên¶

Tuy nhiên, với lớp IntEnum đặc biệt, các giá trị liệt kê là số nguyên, vì vậy tất cả các phép so sánh theo thứ tự đều hoạt động như mong đợi.

>>> print[repr[Colors.red]]

2

So sánh với các số khác cũng hoạt động như mong đợi

>>> print[repr[Colors.red]]

3

Bạn thậm chí có thể so sánh các giá trị liệt kê số nguyên với các giá trị số nguyên không liên quan khác, vì phép so sánh sử dụng các toán tử số nguyên tiêu chuẩn

>>> print[repr[Colors.red]]

4

Chuyển đổi¶

Bạn có thể chuyển đổi trở lại mục liệt kê bằng cách sử dụng Enum của lớp getitem , chuyển vào giá trị cho mục bạn muốn.

>>> print[repr[Colors.red]]

5

Lớp Enum cũng chấp nhận tên chuỗi của giá trị liệt kê.

>>> print[repr[Colors.red]]

6

Để thống nhất, cú pháp getitem chấp nhận một giá trị liệt kê.

>>> print[repr[Colors.red]]

7

phép lặp¶

Lớp hỗ trợ Enum . Các giá trị liệt kê được trả về theo thứ tự sắp xếp của các giá trị tương đương của chúng.

>>> print[repr[Colors.red]]

8

Các giá trị liệt kê có thể băm được, vì vậy chúng có thể được sử dụng trong từ điển và bộ

>>> print[repr[Colors.red]]

9

Mở rộng một kiểu liệt kê thông qua phân lớp¶

Bạn có thể mở rộng các liệt kê đã xác định trước đó bằng cách phân lớp. Cũng như trước đây, các giá trị không thể trùng lặp trong lớp cơ sở hoặc lớp con

>>> from flufl.enum import IntEnum
>>> class Animals[IntEnum]:
..     ant = 1
..     bee = 2
..     cat = 3
0

Khi được mở rộng theo cách này, các giá trị của phép liệt kê cơ sở giống hệt với các giá trị được đặt tên giống nhau trong lớp dẫn xuất

>>> from flufl.enum import IntEnum
>>> class Animals[IntEnum]:
..     ant = 1
..     bee = 2
..     cat = 3
1

ngâm chua

Các bảng liệt kê được tạo bằng cú pháp lớp cũng có thể được chọn và bỏ chọn

>>> from flufl.enum import IntEnum
>>> class Animals[IntEnum]:
..     ant = 1
..     bee = 2
..     cat = 3
2

API chức năng¶

Như đã mô tả ở trên, bạn có thể tạo các bảng liệt kê theo chức năng bằng cách gọi Enum hoặc IntEnum.

Đối số đầu tiên luôn là tên của kiểu liệt kê mới. Đối số thứ hai mô tả tên và giá trị của giá trị liệt kê. Như đã đề cập trước đây, cách dễ nhất để tạo bảng liệt kê mới là cung cấp một chuỗi duy nhất có tên thuộc tính được phân tách bằng dấu cách. Trong trường hợp này, các giá trị là số nguyên được gán tự động bắt đầu từ 1

>>> from flufl.enum import IntEnum
>>> class Animals[IntEnum]:
..     ant = 1
..     bee = 2
..     cat = 3
3

Đối số thứ hai cũng có thể là một chuỗi các chuỗi. Trong trường hợp này cũng vậy, các giá trị là số nguyên được gán tự động bắt đầu từ 1

>>> from flufl.enum import IntEnum
>>> class Animals[IntEnum]:
..     ant = 1
..     bee = 2
..     cat = 3
4

Các mục trong nguồn cũng có thể là 2 bộ, trong đó mục đầu tiên là tên giá trị liệt kê và mục thứ hai là giá trị sử dụng. Nếu 2-bộ được cung cấp, tất cả các mục phải là 2-bộ

>>> from flufl.enum import IntEnum
>>> class Animals[IntEnum]:
..     ant = 1
..     bee = 2
..     cat = 3
5

Vì các giá trị cho loại Enum không cần phải là số nguyên, nên bạn cũng có thể cung cấp đối số thứ hai trong từ điển ánh xạ tên tới các giá trị. Hãy nhớ rằng repr được sắp xếp theo giá trị.

>>> from flufl.enum import IntEnum
>>> class Animals[IntEnum]:
..     ant = 1
..     bee = 2
..     cat = 3
6

Nếu bạn muốn tạo một IntEnum trong đó các giá trị là các lớp con số nguyên, hãy gọi lớp đó thay thế. Điều này có cùng chữ ký với cách gọi Enum nhưng các mục của phép liệt kê được trả về là các lớp con int.

>>> from flufl.enum import IntEnum
>>> class Animals[IntEnum]:
..     ant = 1
..     bee = 2
..     cat = 3
7

Sự khác biệt so với PEP 354¶

Không giống như PEP 354, các giá trị liệt kê không được định nghĩa là một chuỗi các chuỗi, mà là các thuộc tính của một lớp. Thiết kế này được chọn vì người ta cảm thấy rằng cú pháp lớp dễ đọc hơn

Không giống như PEP 354, các giá trị liệt kê yêu cầu một giá trị số nguyên rõ ràng. Sự khác biệt này nhận ra rằng các phép liệt kê thường đại diện cho các giá trị trong thế giới thực hoặc phải tương tác với các hệ thống trong thế giới thực bên ngoài. Ví dụ: để lưu trữ một phép liệt kê trong cơ sở dữ liệu, tốt hơn là chuyển đổi nó thành một số nguyên khi vào và quay lại một phép liệt kê khi ra. Cung cấp một giá trị số nguyên cũng cung cấp một thứ tự rõ ràng. Tuy nhiên, không có chuyển đổi tự động sang và từ các giá trị số nguyên, bởi vì rõ ràng tốt hơn ngầm định

Không giống như PEP 354, triển khai này sử dụng siêu dữ liệu để xác định cú pháp của phép liệt kê và cho phép liệt kê cơ sở mở rộng để các giá trị chung trong các lớp dẫn xuất giống hệt nhau [mô hình đơn lẻ]. Mặc dù PEP 354 đã bác bỏ cách tiếp cận này vì sự phức tạp của nó, nhưng trên thực tế, bất kỳ sự phức tạp nào được nhận thức, mặc dù ở mức tối thiểu, đều bị ẩn đối với người dùng bảng liệt kê

Chủ Đề