Python library to build pretty command line user prompts with interactive forms and validation
Overall
score
96%
Text input prompts provide basic text collection functionality with support for single-line input, password masking, multiline text, and input validation.
Prompts for single-line text input with optional default values, validation, and custom styling.
def text(message: str, default: str = "", validate: Any = None,
qmark: str = "?", style: Optional[Style] = None,
multiline: bool = False, instruction: Optional[str] = None,
lexer: Optional[Lexer] = None, **kwargs) -> Question:
"""
Create a text input prompt.
Args:
message: The question/prompt text to display
default: Default value pre-filled in input
validate: Validator function or Validator instance for input validation
qmark: Question prefix symbol (default "?")
style: Custom styling configuration
multiline: Enable multiline input mode
instruction: Additional instruction text displayed below prompt
lexer: Syntax highlighting lexer for multiline input
**kwargs: Additional prompt_toolkit arguments
Returns:
Question instance ready for execution
"""Prompts for password or sensitive text input with characters masked/hidden during typing.
def password(message: str, default: str = "", validate: Any = None,
qmark: str = "?", style: Optional[Style] = None,
**kwargs) -> Question:
"""
Create a password input prompt with hidden text.
Args:
message: The question/prompt text to display
default: Default value (not recommended for passwords)
validate: Validator function or Validator instance
qmark: Question prefix symbol (default "?")
style: Custom styling configuration
**kwargs: Additional prompt_toolkit arguments
Returns:
Question instance ready for execution
"""import questionary
# Basic text input
name = questionary.text("Enter your name:").ask()
# Text input with default value
city = questionary.text("Enter your city:", default="New York").ask()
# Text input with validation
def validate_email(text):
if "@" not in text:
return "Please enter a valid email address"
return True
email = questionary.text(
"Enter your email:",
validate=validate_email
).ask()import questionary
# Basic password input
password = questionary.password("Enter password:").ask()
# Password with validation
def validate_password(password):
if len(password) < 8:
return "Password must be at least 8 characters"
return True
secure_password = questionary.password(
"Create password:",
validate=validate_password
).ask()import questionary
# Multiline text input
description = questionary.text(
"Enter description:",
multiline=True,
instruction="Press ESC then ENTER to submit"
).ask()
# Multiline with syntax highlighting
code = questionary.text(
"Enter Python code:",
multiline=True,
lexer=PythonLexer() # Requires pygments
).ask()import questionary
from questionary import Validator, ValidationError
# Custom validator class
class NumberValidator(Validator):
def validate(self, document):
try:
int(document.text)
except ValueError:
raise ValidationError(
message="Please enter a valid number",
cursor_position=len(document.text)
)
age = questionary.text(
"Enter your age:",
validate=NumberValidator()
).ask()
# Lambda validation
phone = questionary.text(
"Enter phone number:",
validate=lambda x: "Invalid format" if not x.isdigit() else True
).ask()import questionary
from prompt_toolkit.styles import Style
custom_style = Style([
('question', 'bold'),
('answer', 'fg:#ff0066 bold'),
('pointer', 'fg:#673ab7 bold'),
('highlighted', 'fg:#673ab7 bold'),
])
name = questionary.text(
"Stylized prompt:",
style=custom_style
).ask()Install with Tessl CLI
npx tessl i tessl/pypi-questionarydocs
evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
scenario-10