- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
使用 Python 编写命令行界面 (CLI) 时 click library , 是否可以定义例如三个选项,其中仅当第一个(可选)未设置时才需要第二个和第三个选项?
我的用例是一个登录系统,它允许我通过 authentication token
(选项 1)或通过 tên người dùng
(选项 2)进行身份验证) 和 mật khẩu
(选项 3)。
如果提供了 token ,则无需检查是否定义了 tên người dùng
Và mật khẩu
或提示它们。否则,如果 token 被省略,则 tên người dùng
Và mật khẩu
将变为必需且必须提供。
可以使用回调以某种方式完成吗?
我的入门代码当然没有反射(reflect)预期的模式:
@click.command()
@click.option('--authentication-token', prompt=True, required=True)
@click.option('--username', prompt=True, required=True)
@click.option('--password', hide_input=True, prompt=True, required=True)
def login(authentication_token, username, password):
print(authentication_token, username, password)
nếu __name__ == '__main__':
login()
câu trả lời hay nhất
这可以通过构建一个派生自 click.Option
的自定义类来完成,并在该类中覆盖 click.Option.handle_parse_result()
方法,例如:
import click
class NotRequiredIf(click.Option):
def __init__(self, *args, **kwargs):
self.not_required_if = kwargs.pop('not_required_if')
assert self.not_required_if, "'not_required_if' parameter required"
kwargs['help'] = (kwargs.get('help', '') +
' NOTE: This argument is mutually exclusive with %s' %
self.not_required_if
).dải()
super(NotRequiredIf, self).__init__(*args, **kwargs)
def handle_parse_result(self, ctx, opts, args):
we_are_present = self.name in opts
other_present = self.not_required_if in opts
if other_present:
if we_are_present:
raise click.UsageError(
"Illegal usage: `%s` is mutually exclusive with `%s`" % (
self.name, self.not_required_if))
khác:
self.prompt = None
return super(NotRequiredIf, self).handle_parse_result(
ctx, opts, args)
要使用自定义类,请将 lớp
参数传递给 click.option
装饰器,例如:
@click.option('--username', prompt=True, cls=NotRequiredIf,
not_required_if='authentication_token')
之所以可行,是因为 click 是一个设计良好的 OO 框架。 @click.option()
装饰器通常实例化一个 click.Option
对象,但允许使用 lớp
参数覆盖此行为。因此,在我们自己的类中继承 click.Option
并覆盖所需的方法是一件相对容易的事情。
在这种情况下,我们超越 click.Option.handle_parse_result()
并禁用 user/password
nếu như authentication-token
token 的需要存在,如果 user/password
Và authentication-token
都存在,则提示。
注意:此答案的灵感来自 câu trả lời này
@click.command()
@click.option('--authentication-token')
@click.option('--username', prompt=True, cls=NotRequiredIf,
not_required_if='authentication_token')
@click.option('--password', prompt=True, hide_input=True, cls=NotRequiredIf,
not_required_if='authentication_token')
def login(authentication_token, username, password):
click.echo('t:%s u:%s p:%s' % (
authentication_token, username, password))
nếu __name__ == '__main__':
login('--username name --password pword'.split())
login('--help'.split())
login(''.split())
login('--username name'.split())
login('--authentication-token token'.split())
từ login('--username name --password pword'.split())
:
t:None u:name p:pword
từ login('--help'.split())
:
Usage: test.py [OPTIONS]
Tùy chọn:
--authentication-token TEXT
--username TEXT NOTE: This argument is mutually exclusive with
authentication_token
--password TEXT NOTE: This argument is mutually exclusive with
authentication_token
--help Show this message and exit.
关于python - 单击命令行界面 : Make options required if other optional option is unset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44247099/
Tôi thường sử dụng var options = options || {} như một cách để mặc định cho một đối tượng trống. Nó thường được sử dụng để khởi tạo đối tượng tùy chọn trong trường hợp nó không được truyền vào đối số của lệnh gọi hàm. Vấn đề là tôi đã đọc ở một số nơi (bài đăng trên blog, mã nguồn) chọn
Tôi mới làm quen với Rust bằng Python. Đây là ngày thứ tư tôi học Rust. Sau câu hỏi đầu tiên Truyền kiểu cho Loại tùy chọn, tôi có một câu hỏi tiếp theo liên quan đến khớp cú pháp và khái niệm về quyền sở hữu. Trước hết, tôi
Tôi đang nghiên cứu Ray Wenderlich. Tôi đang gặp lỗi cú pháp đóng. Tôi muốn biết dấu nhắc Xcode nghĩa là gì? Xcode báo cáo điều này: /Users/.../FlickrPhotosViewControlle
Khi viết giao diện dòng lệnh (CLI) bằng thư viện nhấp chuột Python, có thể xác định, chẳng hạn như ba tùy chọn, trong đó tùy chọn thứ hai và thứ ba chỉ được yêu cầu nếu tùy chọn đầu tiên (tùy chọn) không được đặt? Trường hợp sử dụng của tôi là một hệ thống đăng nhập cho phép tôi
Tôi có một truy vấn JPA như thế này. PersonRepository.java public Tùy chọn> findByStatus(int status);
Tôi đã gặp rất nhiều nơi mà tôi có thứ gì đó như def f(s: String): Option[Long] = ... def g(l: Long): IO[Option[Wibble]] = ... val Một
Tôi có kết quả: List[Future[Option[T]]] chứa các phép tính (song song). Tôi muốn nhận được kết quả không phải Không đầu tiên càng sớm càng tốt hoặc trả về Không nếu tất cả các phép tính đều trả về Không. Hiện tại, tôi đang thực hiện việc này.
Tôi đang cố tải một thành phần Listbox đơn giản từ @headlessui/react . select.tsx type Option = { id: number name: string
Làm cách nào để chuyển đổi Tương lai[Tùy chọn[Tương lai[Tùy chọn[X]]]] thành Tương lai[Tùy chọn[X]]? Nếu là TraversableOnce thay vì Option tôi sẽ sử dụng Futur
Các ngôn ngữ như Haskell và Rust cung cấp loại Maybe hoặc Option. Ngay cả trong Java hiện nay cũng có kiểu gõ Tùy chọn. Để đơn giản, tôi sẽ gọi loại này là “loại tùy chọn” trong các câu hỏi còn lại.
Khi tôi cố gắng lưu trữ XML bằng SQL thay vì một phần tử trống, SQL chỉ thay đổi nó và lưu trữ nó chỉ bằng một thẻ phần tử. Ví dụ: XML cần lưu trữ là: ROGER và sau đó chỉ cần lưu nó trong Sql.
Tôi đã gặp phải một vấn đề nhỏ khi sử dụng trình phân tích cú pháp dòng lệnh rất hay này Argo (chỉ thư viện C++ tiêu đề). Xem: https://github.com/phforest/Argo Argo trả về: 'Lỗi: Un
Tôi mới làm quen với Scala và có nền tảng Java và hiện đang bối rối về các phương pháp hay nhất khi xem xét Option[T]. Tôi cảm thấy việc sử dụng Option.map chỉ thực tế và đẹp mắt hơn, nhưng đó không phải là lý do chính đáng để thuyết phục người khác. Đôi khi, trống rỗng
Câu hỏi này đã có câu trả lời ở đây: Chuỗi tùy chọn trong Java 8 (9 câu trả lời) Tùy chọn hoặc Tùy chọn khác trong Java (6 câu trả lời) Functio
Tùy chọn::stream trả về Luồng chứa giá trị nếu có, nếu không thì trả về luồng trống. Vì vậy, đối với Stream> tùy chọn, tùy chọn.flatMap(Tùy chọn:
Tôi đã sử dụng các phím mũi tên làm đầu vào để di chuyển mũi tên printf lên và xuống ("==>") trong menu printf. Tôi đang sử dụng một hàm để tính toán vị trí của mũi tên, sử dụng trường hợp chuyển đổi và printf("\n==>")
Câu hỏi này đã có câu trả lời ở đây: Cấu trúc x = x || y có nghĩa là gì? (12 câu trả lời) Đã đóng 9 năm trước. Như đã đề cập trong tiêu đề câu hỏi của tôi, gần đây tôi tình cờ phát hiện ra khai báo biến này:
Câu hỏi này đã có câu trả lời ở đây: BackboneJS: Tùy chọn là gì || (options = {}); trong mã nguồn Backbone (1 câu trả lời) Đóng 8
Tôi có cú pháp đơn giản này: word = Word(alphanums + '_') with_stmt = Suppress('with') + OneOrMore(Group(word('key') +
Viết bài kiểm tra bằng Cucumber và SitePrism, tôi có HTML sau trên trang... Chọn Trạng thái Đang hoạt động Sản phẩm Không hoạt động
Tôi là một lập trình viên xuất sắc, rất giỏi!