- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何使用click编写命令行提示符,如下所示:
choose name:
[1] Karen
[2] Bob
[3] Jo
[4] Steve
并调用一个函数,例如:
def print_function(name):
if name == 'Karen':
print('CEO')
elif name == 'Bob':
print('CFO')
elif name == 'Jo':
print('COO')
elif name == 'Steve':
print('CIO')
else:
raise ValueError('Wrong name')
总而言之,如何创建一个显示用户选项并允许他们输入整数以选择与这些选项对应的命令提示符?
此外,如果从命令行调用函数时使用了 --name Bob
,如何使命令提示符可选?
最佳答案
使用继承自 click.Option
的自定义类,您可以拦截选项处理并显示所需的菜单,然后像这样验证响应:
import click
class EnumMenuPromptFromDict(click.Option):
def __init__(self, *args, **kwargs):
super(EnumMenuPromptFromDict, self).__init__(*args, **kwargs)
if 'prompt' not in kwargs:
raise TypeError(
"'prompt' keyword required for '{}' option".format(
args[0][0]))
self.choices_dict = self.prompt
self.prompt_menu = '\n'.join('[{}] {}'.format(i + 1, name)
for i, name in enumerate(self.prompt))
self.prompt = 'Choose from,\n{}\n{}'.format(
self.prompt_menu, self.name)
def prompt_for_value(self, ctx):
"""Get entered value and then validate"""
while True:
value = super(EnumMenuPromptFromDict, self).prompt_for_value(ctx)
try:
choice = int(value)
if choice > 0:
return list(self.choices_dict)[choice - 1]
except (ValueError, IndexError):
if value in self.choices_dict:
return value
click.echo('Error: {} is not a valid choice'.format(value))
def full_process_value(self, ctx, value):
"""Convert the entered value to the value from the choices dict"""
value = super(EnumMenuPromptFromDict, self).full_process_value(
ctx, value)
try:
return self.choices_dict[value]
except (KeyError, IndexError):
raise click.UsageError(
"'{}' is not a valid choice".format(value), ctx)
要使用自定义类,请将 cls
参数传递给 @click.option()
装饰器,例如:
@click.option('--name', cls=EnumMenuPromptFromDict, prompt=titles)
prompt
是一个选项的字典,例如:
titles = OrderedDict((
('Karen', 'CEO'),
('Bob', 'CFO'),
('Jo', 'COO'),
('Steve', 'CIO')
))
之所以可行,是因为 click 是一个设计良好的 OO 框架。 @click.option()
装饰器通常实例化一个 click.Option
对象,但允许使用 cls
参数覆盖此行为。因此,在我们自己的类中继承 click.Option
并覆盖所需的方法是一件相对容易的事情。
在这种情况下,我们越过 click.Option.prompt_for_value()
来拦截命令处理并允许输入菜单编号或值。我们还覆盖了 click.Option.full_process_value()
以将名称转换为标题。
from collections import OrderedDict
titles = OrderedDict((
('Karen', 'CEO'),
('Bob', 'CFO'),
('Jo', 'COO'),
('Steve', 'CIO')
))
@click.command()
@click.option('--name', cls=EnumMenuPromptFromDict, prompt=titles)
def cli(name):
"""The Great CLI APP"""
click.echo('a title: %s' % name)
if __name__ == "__main__":
print('Click Version: {}'.format(click.__version__))
print('Python Version: {}'.format(sys.version))
cli([])
关于python - 如何创建在整数旁边显示选项并允许使用整数输入选择选项的命令行提示符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49186376/
给定一个 Option[Future[Option[Int]]] : scala> val x: Option[Future[Option[Int]]] = Some ( Future ( Some
如果我理解正确,EitherT[Option,A,B] 应该与 Option[Either[A,B]] 相同,但编译器不同意.以下代码编译失败: def f[A,B] = implicitly[Eit
我刚开始在使用 parcel.js 构建静态 Assets 时遇到此错误。它在本地工作,但我在 Heroku 上的构建出错,我不确定它是否相关。 最佳答案 得到同样的问题。通过将 core-js 安装
当我生成 Telerik Report 时,只有 Export PDF 可用。即使我将 docx 和 xlsx 的配置设置为 true。这是我在网络配置中的配置。
我的 iTunesConnect 应用程序显示 Apple Pay 选项。我正在使用布伦特里。 即使我们没有在应用程序中使用 Apple Pay 功能。 有人可以帮我解决如何在我的 itunesCon
我正在 Raspbian 中从命令行运行以下查询: mysql -u $NAME -p $PASS Tweets -e "SELECT count(*) FROM raw_tweets;" 它输出以下
我正在尝试使用 ffmpeg(在 linux 下)为视频添加一个小标题。所以,我使用: ffmpeg -i hk.avi -r 30000/1001 -metadata title="SOF" hk_
我正在尝试使用 ffmpeg 使用 ffserver 流式传输视频。您将在 ffserver1.conf 文件下方找到 ffmpeg 命令的日志输出。 其中一个错误引用了预设,每次我尝试使用预设时,我
我正在尝试对 Option 使用 fold 或 map 操作而不是 match。 我有一个选项 val ao: Option[String] = xxxx 和一个函数 f: (String => Fu
Dockerfile documentation表示有可能通过 --platform FROM 中的选项像这样的指令: FROM [--platform=] [AS ] 在我的 dockerfile
我不确定“属性(property)”或“选项”是否是正确的术语,但这是我需要弄清楚的。 鉴于以下情况: ' $.fileup({ url: '/file/upload',
我正在尝试使用 jQuery 检查是否选择了值 = 1 的选择选项,然后将类添加到某些元素。但有些东西不起作用。可以请人看一下代码吗? 我的代码: Reservation
我对 VIM 中的这些感到困惑。有些事情需要设置,而另一些则让。 而且,我如何检查某个选项。我知道这是一个选项,因为我使用 set 来更改它。 例如,如何检查当前文件类型选项是否为 java? 最佳答
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我在看《Professional F# 2.0》一书作者展示如下代码 let a string : option = None if a.IsNone then System.Console.
我习惯使用方法顶部的 java 样板检查输入参数: public static Boolean filesExist(String file1, String file2, String file3
假设我有一串 "Insert Post -title Some PostTitle -category 2 -date-posted 2013-02:02 10:10:10" 我一直在尝试做的是将这个
从 1.3.70 EAP 开始,在 org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions 这是 var useIR: kotlin.Boolean 哪个激活
我无法获取订购捆绑商品的所有子产品及其选项。这可能吗? 最佳答案 以下是您如何找出哪些产品应与所有其他项目一起附加到列表中的捆绑产品中的方法: foreach ($order->getAllItems
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我是一名优秀的程序员,十分优秀!