上記のスクリプトはこちら
(questionary==1.10.0
を使用)
import questionary
name = questionary.text('Name?').ask()
age = int(questionary.text('Age?').ask())
sex = questionary.select(
'Sex?',
choices=["Male", "Female"]
).ask()
if sex == "Male":
print(f"Hello {name}! {age} years old gentleman!")
else:
print(f"Hello {name}! {age} years old lady!")
使用例
テキスト入力
import questionary
name = questionary.text('Name?').ask()
デフォルト値を設定する
import questionary
name = questionary.text('Name?', default='My Default Name').ask()
print(name)
click
のようにtype
引数は使えない。
入力値を数値にしたい場合はint()
やfloat()
でキャストする。
入力値のバリデーションを別途行う必要がある(後述)。
対話式に選択(単一)
import questionary
sex = questionary.select(
'Sex?',
choices=["Male", "Female"],
).ask()
print(sex)
選択肢に表示する名前と実際の変数値を使い分ける
import questionary
from questionary import Choice
sex = questionary.select(
'Sex?',
choices=[
Choice(title="Male", value=0),
Choice(title="Female", value=1),
],
).ask()
print(sex)
デフォルト値を設定する
指定した値が選択された状態の対話モードになる
import questionary
sex = questionary.select(
'Sex?',
choices=["Male", "Female"],
default="Female",
).ask()
print(sex)
選択肢に連番を振る
use_shortcuts
引数。
import questionary
sex = questionary.select(
'Sex?',
choices=["Male", "Female"],
use_shortcuts=True
).ask()
print(sex)
例の場合、1
キーまたは2
キーを入力することで選択肢を移動することができる。
区切り線を設ける
import questionary
from questionary import Separator
sex = questionary.select(
'Sex?',
choices=[
"Male",
Separator("---"),
"Female",
],
).ask()
print(sex)
無効な選択肢
import questionary
from questionary import Choice
sex = questionary.select(
'Sex?',
choices=[
"Male",
"Female",
Choice(title="Disabled", disabled="Cannot use!")
],
).ask()
print(sex)
対話式に選択(複数)
import questionary
choiced_items = questionary.checkbox(
"Select items.",
choices=[
'item1',
'item2',
'item3',
]
).ask()
print(choiced_items)
選択肢に表示する名前と実際の変数値を使い分ける
questionary.select
の場合と同様にquestionary.Choice
を使用
import questionary
from questionary import Choice
choiced_items = questionary.checkbox(
"Select items.",
choices=[
Choice('item1', value=1),
Choice('item2', value=2),
Choice('item3', value=3),
]
).ask()
print(choiced_items)
デフォルトで選択済みにする
item2
を選択済みにする
import questionary
from questionary import Choice
choiced_items = questionary.checkbox(
"Select items.",
choices=[
"item1",
Choice("item2", checked=True),
"item3",
]
).ask()
print(choiced_items)
ファイルパス
import questionary
path = questionary.path(
"What's the path to the projects version file?"
).ask()
print(path)
スラッシュキーで候補が表示される(すごい)。
タブキーで自動補完入力される(すごい)。
Yes|No (真偽値)
import questionary
is_engineer = questionary.confirm('Are you engineer?').ask()
print(is_engineer)
デフォルトをFalseにする
import questionary
is_engineer = questionary.confirm(
'Are you engineer?',
default=False
).ask()
print(is_engineer)
その他
オートコンプリートなSelect
ローマ字表記の都道府県を入力するケースを考える。
都道府県一覧
prefectures.py
PREFECTURES = [
"hokkaido",
"aomori",
"iwate",
"miyagi",
"akita",
"yamagata",
"fukushima",
"ibaraki",
"tochigi",
"gunma",
"saitama",
"chiba",
"tokyo",
"kanagawa",
"niigata",
"toyama",
"ishikawa",
"fukui",
"yamanashi",
"nagano",
"gifu",
"shizuoka",
"aichi",
"mie",
"shiga",
"kyoto",
"osaka",
"hyogo",
"nara",
"wakayama",
"tottori",
"shimane",
"okayama",
"hiroshima",
"yamaguchi",
"tokushima",
"kagawa",
"ehime",
"kochi",
"fukuoka",
"saga",
"nagasaki",
"kumamoto",
"oita",
"miyazaki",
"kagoshima",
"okinawa",
]
import questionary
from prefectures import PREFECTURES
prefecture = questionary.autocomplete(
"お住まいの都道府県は?",
choices=PREFECTURES
).ask()
print(prefecture)
入力値バリデーション
入力値が整数であることを検証する例。
import questionary
from questionary import Validator, ValidationError
class IntegerValidator(Validator):
def validate(self, document):
try:
int(document.text)
except:
raise ValidationError(
message=f"{document.text} is not valid integer.",
cursor_position=len(document.text)
)
age = questionary.text("Age?", validate=IntegerValidator).ask()
print(age)
プロンプトを動的に分岐
import questionary
sex = questionary.select(
"Sex?",
choices=["Male", "Female"]
).ask()
is_male = sex == "Male"
questionary.text(
"女性の方にお聞きします。愛用する化粧品を教えてください:"
).skip_if(is_male).ask()