2013-08-27 26 views
20

Tôi đang sử dụng argparse để nhận đầu vào dòng lệnh và cũng để tạo văn bản trợ giúp. Tôi muốn sử dụng ArgumentDefaultsHelpFormatter làm formatter_class, tuy nhiên điều này ngăn cản tôi cũng sử dụng RawDescriptionHelpFormatter mà sẽ cho phép tôi thêm định dạng tùy chỉnh vào mô tả hoặc epilog của tôi.ArgumentParser epilog và định dạng mô tả kết hợp với ArgumentDefaultsHelpFormatter

Có phương pháp hợp lý nào để đạt được điều này ngoài việc viết mã để tạo văn bản cho các giá trị mặc định không? Theo tài liệu argparse, tất cả nội bộ của ArgumentParser được coi là chi tiết triển khai, không phải API công khai, do đó, phân loại phụ không phải là một tùy chọn hấp dẫn.

Trả lời

28

Tôi chỉ cố gắng một cách tiếp cận đa kế thừa, và nó hoạt động:

class CustomFormatter(argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter): 
    pass 

parser = argparse.ArgumentParser(description='test\ntest\ntest.', 
           epilog='test\ntest\ntest.', 
           formatter_class=CustomFormatter) 

Điều này có thể phá vỡ nếu bên trong của các lớp này thay đổi mặc dù.

+0

Phân lớp theo cách này không phụ thuộc vào nội bộ. Nếu kế thừa nhiều hoạt động ngay bây giờ, nó sẽ trong tất cả các thay đổi trong tương lai. Như giải pháp của tôi cho thấy, hai lớp đang thay đổi các phương thức định dạng khác nhau. – hpaulj

+0

Ví dụ khác sử dụng bội số kế thừa này: http://stackoverflow.com/questions/23567393/pythons-argh-library-preserve-docstring-formatting-in-help-message/23583350#23583350 – hpaulj

+0

@hpaulj Các phương thức định dạng không một phần của API công khai. Từ docstring của 'argparse.HelpFormatter':' Chỉ tên của lớp này được coi là một API công khai. Tất cả các phương thức do lớp cung cấp được coi là chi tiết triển khai.'. Cả hai lớp có thể được viết lại hoàn toàn. – timdiels

1

Tôi không thấy lý do tại sao phân lớp HelpFormatter phải là vấn đề. Điều đó không gây rối với nội bộ của ArgumentParser. Tài liệu này có các ví dụ về các lớp học (hoặc chức năng) tùy chỉnh ActionType. Tôi lấy đường dây 'there are four such classes' để được mời viết HelpFormatter của riêng tôi nếu cần.

Các lớp con được cung cấp HelpFormatter thực hiện các thay đổi khá đơn giản, chỉ thay đổi một hàm. Vì vậy, chúng có thể dễ dàng sao chép hoặc thay đổi.

RawDescription chỉ thay đổi:

def _fill_text(self, text, width, indent): 
    return ''.join(indent + line for line in text.splitlines(keepends=True)) 

Về lý thuyết nó có thể được thay đổi mà không thay đổi API, nhưng đó là khó xảy ra.

Các giá trị mặc định định dạng chỉ thay đổi:

def _get_help_string(self, action): 
    help = action.help 
    if '%(default)' not in action.help: 
     if action.default is not SUPPRESS: 
      defaulting_nargs = [OPTIONAL, ZERO_OR_MORE] 
      if action.option_strings or action.nargs in defaulting_nargs: 
       help += ' (default: %(default)s)' 
    return help 

Bạn có thể nhận được tác dụng tương tự bằng cách chỉ bao gồm %(default)s trong tất cả các dòng giúp đỡ lập luận của bạn. Ngược lại với các lớp con Raw, đây chỉ là một lớp tiện lợi. Nó không cung cấp cho bạn nhiều quyền kiểm soát hơn đối với định dạng.

Các vấn đề liên quan