| 781 | positional_option_name = attr.ib() # type: str |
| 782 | |
| 783 | def parse_args( |
| 784 | self, |
| 785 | args=None, # type: Optional[Sequence[str]] |
| 786 | namespace=None, # type: Optional[Namespace] |
| 787 | ): |
| 788 | # type: (...) -> Namespace |
| 789 | |
| 790 | options = self.parser.parse_args(args=args, namespace=namespace) |
| 791 | |
| 792 | extra_args = [] |
| 793 | positionals = [] |
| 794 | for positional in getattr(options, self.positional_option_name): |
| 795 | if positional.startswith("@"): |
| 796 | with open(positional[1:]) as fp: |
| 797 | extra_args.extend(fp.read().splitlines()) |
| 798 | else: |
| 799 | positionals.append(positional) |
| 800 | setattr(options, self.positional_option_name, positionals) |
| 801 | |
| 802 | if extra_args: |
| 803 | extra_options = self.parser.parse_args(extra_args) |
| 804 | for name, value in vars(extra_options).items(): |
| 805 | existing_value = getattr(options, name, None) |
| 806 | if isinstance(existing_value, list) and value: |
| 807 | existing_value.extend(value) |
| 808 | elif existing_value is None or value is not None: |
| 809 | setattr(options, name, value) |
| 810 | |
| 811 | return options |
| 812 | |
| 813 | |
| 814 | def configure_clp(): |