Không có lý do chính đáng để muốn viết này sử dụng một từ điển trong Python. Thật kỳ lạ và không phải là một cách phổ biến cho các chức năng không gian tên.
Các triết lý Python mà áp dụng ở đây là:
Nên có cùng-- và tốt nhất là chỉ có một cách --obvious để làm điều đó.
Kết hợp với
Độ khó đếm.
Làm theo cách này cũng làm cho mọi thứ khó hiểu và dễ đọc đối với người dùng Python điển hình.
Những điều tốt mà từ điển trong trường hợp này là các chuỗi bản đồ hoạt động và không gian tên chúng trong từ điển, nhưng chức năng này đã được cung cấp bởi cả mô đun và lớp và dễ hiểu hơn với những người quen thuộc với Python.
Ví dụ: phương pháp
Module:
#cool.py
def cool():
print 'cool'
Bây giờ sử dụng các mô-đun như bạn sẽ được sử dụng dict của bạn: Phương pháp
import cool
#cool.__dict__['cool']()
#update - to the more correct idiom vars
vars(cool)['cool']()
Class:
class Cool():
def cool():
print 'cool'
#Cool.__dict__['cool']()
#update - to the more correct idiom vars
vars(Cool)['cool']()
Chỉnh sửa sau khi nhận xét bên dưới:
argparse có vẻ phù hợp với vấn đề này, vì vậy bạn không phải phát minh lại bánh xe. Nếu bạn quyết định thực hiện nó hoàn toàn cho mình mặc dù nguồn argparse sẽ cung cấp cho bạn một số hướng tốt. Dù sao, các phần bên dưới dường như áp dụng cho trường hợp sử dụng này:
15.4.4.5. Ngoài sys.argv
Thỉnh thoảng có thể hữu ích khi có đối số phân tích cú pháp ArgumentParser khác với đối số của sys.argv. Điều này có thể được thực hiện bằng cách chuyển một danh sách các chuỗi tới parse_args(). Điều này hữu ích khi thử nghiệm tại dấu nhắc tương tác :
15.4.5.1. Sub-commands¶
ArgumentParser.add_subparsers()
Nhiều chương trình chia tay chức năng của họ thành một số tiểu lệnh, ví dụ, chương trình svn có thể gọi tiểu lệnh như thanh toán svn, cập nhật svn, và svn cam kết.
15.4.4.6. Đối tượng Không gian tên
Cũng có thể hữu ích khi có một thuộc tính gán ArgumentParser cho đối tượng đã tồn tại, thay vì đối tượng Không gian tên mới. này có thể đạt được bằng cách xác định namespace = từ khóa luận:
Update, đây là một ví dụ sử dụng argparse
strategizer = argparse.ArgumentParser()
strat_subs = strategizer.add_subparsers()
math = strat_subs.add_parser('math')
math_subs = math.add_subparsers()
math_max = math_subs.add_parser('max')
math_sum = math_subs.add_parser('sum')
math_max.set_defaults(strategy=max)
math_sum.set_defaults(strategy=sum)
strategizer.parse_args('math max'.split())
Out[46]: Namespace(strategy=<built-in function max>)
strategizer.parse_args('math sum'.split())
Out[47]: Namespace(strategy=<built-in function sum>)
Tôi muốn lưu ý những lý do tôi muốn giới thiệu argparse
- Chủ yếu là yêu cầu sử dụng các chuỗi đại diện cho các tùy chọn và tùy chọn phụ để ánh xạ tới các hàm.
- Nó chết đơn giản (sau khi vượt qua mô-đun đầy tính năng argparse).
- Sử dụng Mô-đun thư viện chuẩn Python. Điều này cho phép những người khác quen thuộc với Python grok những gì bạn đang làm mà không cần phải đưa vào chi tiết triển khai và được tài liệu rất tốt cho những người không làm việc đó.
- Nhiều tính năng bổ sung có thể được tận dụng lợi thế ngoài hộp (không phải lý do tốt nhất!).
Sử dụng argparse và Chiến lược Pattern cùng
Đối với việc thực hiện đơn giản và đơn giản của mẫu chiến lược, điều này đã được trả lời rất tốt.
How to write Strategy Pattern in Python differently than example in Wikipedia?
#continuing from the above example
class MathStudent():
def do_math(self, numbers):
return self.strategy(numbers)
maximus = strategizer.parse_args('math max'.split(),
namespace=MathStudent())
sumera = strategizer.parse_args('math sum'.split(),
namespace=MathStudent())
maximus.do_math([1, 2, 3])
Out[71]: 3
sumera.do_math([1, 2, 3])
Out[72]: 6
Bạn có thể giải thích lý do bạn muốn thực hiện việc này không? Nếu bạn muốn một giá trị trở lại từ một hàm, bạn có thể đặt nó vào từ điển bằng cách sử dụng 'd ['function'] = my_func()'; nếu bạn muốn một hàm bạn sẽ không bao giờ thực sự cần nữa, bạn có thể sử dụng 'lambda'. – Makoto
Một lambda không làm việc cho tôi, bởi vì tôi cần các câu lệnh trong hàm. Hàm này không nhỏ. Tôi muốn tránh tuyên bố chức năng nếu tôi có thể. Tôi muốn hàm được khai báo nội dòng. –
Làm thế nào để bạn mong đợi để có thể sử dụng bất cứ điều gì mà không được xác định tại thời điểm (không phải vị trí tập tin vật lý) nó sẽ được sử dụng? Python định nghĩa một hàm bằng cách thực thi câu lệnh 'def'. Python định nghĩa dict của bạn bằng cách thực thi 'd = {etc etc etc}'. –