Trong một thời gian dài tôi đã cố gắng tìm ra cách tốt nhất để truyền cờ cho hàm python là gì. Cách đơn giản nhất là một cái gì đó như:Python: chuyển cờ sang hàm
def func(data, flag1, flag2, flag3):
...
func(my_data, True, False, True)
Đây là thật sự tốt đẹp và súc tích, nhưng vô cùng khó đọc, vì chữ "Đúng" hay "Sai" cho bạn biết gì về những gì cờ đã được thiết lập, và bạn phải cẩn thận đếm các đối số bắt đầu từ bên trái. Bạn có thể đặt cho họ các đối số từ khóa:
def func(data, flag1=False, flag2=False, flag3=False):
...
func(my_data, flag1=True, flag3=True)
nhưng điều này là thừa, vì "True" không mang ý nghĩa gì cả. Tôi có thể vượt qua nó như là một danh sách:
func(mydata, ['flag1', 'flag3'])
hoặc
func(mydata, [func.flag1, func.flag3])
Nhưng người đầu tiên cảm thấy khá bẩn, sử dụng chuỗi như cờ, và thứ hai là vẫn còn hơi lặp đi lặp lại. Lý tưởng nhất là tôi muốn nói điều gì đó như:
func(my_data, flag1, flag3)
để chuyển cờ sang hàm có độ dài và độ dư tối thiểu. Có cách nào để làm một cái gì đó như thế này trong python?
EDIT: tôi đã kết thúc đi với:
func(mydata, flagA=1, flagB=1)
chủ yếu là vì những lý do nêu: thời gian biên dịch kiểm tra (so với đi qua trong chuỗi), không có ô nhiễm không gian tên (như trái ngược với việc sử dụng toàn cầu "ENUM" s) và bản mẫu tối thiểu (= 1 hoặc = 0 chỉ có 2 ký tự, so với 5 hoặc 6 cho = True hoặc = False). Nó cũng làm cho thiết lập các giá trị mặc định cho các cờ rất dễ dàng:
def func(data, flagA=1, flagB=0, flagC=1):
...
rõ ràng hơn và dễ dàng hơn nhiều so với nhảy qua các vòng để trích xuất và gán mặc định cho ** cờ kiểu kwarg. Các cờ cơ bản được kiểm tra tĩnh và rất rõ ràng/sạch sẽ để viết. Bây giờ nếu duy nhất tôi có thể cạo ra khỏi hai nhân vật cuối cùng ...
Tại sao bạn muốn/cần phải vượt qua những lá cờ ở nơi đầu tiên? Có thể bạn nên suy nghĩ lại về giao diện của mình ... –
Cờ sẽ được sử dụng để đặt các bool trong cấu trúc dữ liệu, sau đó sẽ kiểm soát hành vi tương lai của các hàm hoạt động trên cấu trúc dữ liệu. Đây là một cách tiếp cận hoàn toàn không phải OO, nhưng tôi đã chọn nó ra khỏi sự đơn giản; bất kể, ngay cả khi tôi đã làm nó theo phong cách OO, những thay đổi hành vi khá tinh tế và có lẽ không đáng để tạo ra cả một gia đình các lớp để xử lý. –
Có lẽ bạn có thể chuyển một cấu trúc dữ liệu (đơn giản) có chứa các giá trị sau đó? Một 'bộ' cờ, hoặc cờ tên bản đồ 'dict' để bools ... –