惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
B
Blog RSS Feed
小众软件
小众软件
博客园_首页
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
大猫的无限游戏
大猫的无限游戏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 聂微东
WordPress大学
WordPress大学
月光博客
月光博客
S
SegmentFault 最新的问题
Engineering at Meta
Engineering at Meta
量子位
V
Visual Studio Blog
罗磊的独立博客
Last Week in AI
Last Week in AI
The Cloudflare Blog
H
Help Net Security
J
Java Code Geeks
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Azure Blog
Microsoft Azure Blog
The GitHub Blog
The GitHub Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
美团技术团队

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Stop Trusting User Input: How to Build a Python 'Validati...
Python Dev · 2026-06-19 · via DEV Community

Stop Trusting User Input: How to Build a Python 'Validation Gate'

For Python beginners who want to stop bad data before it wrecks their scripts.

🤔 What Is a Validation Gate?

Think of a nightclub bouncer — their only job is checking people at the door. A Validation Gate is the same: a block of code between input collection and program logic whose only job is to ask "is this data safe to enter?"

User Input → [VALIDATION GATE] → Business Logic → Output

Bad input? STOP. Print error. Exit.

Bad data gets stopped immediately, instead of silently corrupting results 50 lines later.

🔢 Lower Bounds and Upper Bounds — Both Matter

Most beginners only check one side:

if age < 0:
    print("Error: age can't be negative!")
    exit()

That only protects one end of the range. What if someone types 99999? It's positive, so it passes — but it's just as wrong.

Lower bound — catches impossibly small values (e.g., Age = -5)
Upper bound — catches unrealistically large values (e.g., Age = 99999)

Both are equally important.

🚀 Why Upper Bounds Matter

User enters 9999 as their age. Your if age < 0 check passes. Now you calculate retirement_year = 2025 + (65 - 9999) and get -7909. No crash — just a silent, absurd result. That's worse than a crash.

Upper-bound violations are caused by unit confusion, extra zeros, copy-paste errors, and malicious input. A proper gate catches all of them.

🛠️ The Full Code

# validation_gate.py
# A beginner-friendly example of defensive input validation in Python


def get_validated_age(prompt="Enter your age: "):
    """
    Collects a user's age and validates it through 3 gates before
    allowing the value to proceed into the rest of the program.
    """

    # --- Define our realistic bounds ---
    MIN_AGE = 0    # An age below 0 is impossible
    MAX_AGE = 120  # An age above 120 is unrealistic for a human

    # --- Collect the raw input and clean up whitespace ---
    user_input = input(prompt).strip()

    # =============================================
    # GATE 1: Type Check
    # Is this actually a whole number?
    # We check this FIRST, before any math.
    # =============================================
    if not user_input.isdigit():
        print(f"❌ Error: '{user_input}' is not a valid whole number.")
        print("   Please enter a number like 25 or 42.")
        exit()

    # Safe to convert to int now, since we already confirmed it's digits-only
    age = int(user_input)

    # =============================================
    # GATE 2: Lower Bound Check
    # Is the number above the minimum?
    # =============================================
    if age < MIN_AGE:
        print(f"❌ Error: Age cannot be negative. You entered: {age}")
        exit()

    # =============================================
    # GATE 3: Upper Bound Check
    # Is the number below the maximum?
    # This is the gate most beginners forget!
    # =============================================
    if age > MAX_AGE:
        print(f"❌ Error: {age} is not a realistic human age.")
        print(f"   Please enter a number between {MIN_AGE} and {MAX_AGE}.")
        exit()

    # =============================================
    # ALL GATES PASSED ✅
    # Only reach here if the input is valid.
    # =============================================
    print(f"✅ Valid age accepted: {age}")
    return age

# --- Main Program ---
if __name__ == "__main__":
    validated_age = get_validated_age()

    # Your actual program logic goes here, safe in the knowledge
    # that validated_age is a sensible number.
    print(f"\nProcessing your data with age = {validated_age}...")
    print("(Your real business logic would go here)")

🔍 Key Points

.strip() — Strips whitespace first. " 25 " becomes "25".

.isdigit() — Checks every character is a digit. "25" passes. "abc" and "25.5" both fail. Always run this before any math to avoid a ValueError.

exit() — Stops the program immediately. Use sys.exit(1) in larger projects.

Order matters. Type check first, then range. Checking if age < 0 before confirming age is a number crashes the moment someone types "abc".

🧪 3 Edge Cases to Try

🔴 Scenario 1: Negative Number

Type: -5
Enter your age: -5
❌ Error: '-5' is not a valid whole number.

Lesson: Gate 1 fires, not Gate 2. The - sign isn't a digit, so .isdigit() returns False immediately. Strict type-checking catches negatives as a free side effect.

🟠 Scenario 2: Upper-Limit Violation

Type: 99999
Enter your age: 99999
❌ Error: 99999 is not a realistic human age.
Please enter a number between 0 and 120.

Lesson: 99999 clears Gate 1 (it's digits) and Gate 2 (it's not negative) — but Gate 3 catches it. This is the entire point of checking both bounds.

🟡 Scenario 3: Text and Decimals

Type: twenty five, then 25.5
Enter your age: twenty five
❌ Error: 'twenty five' is not a valid whole number.

Lesson: Gate 1 rejects both before any numeric check runs. Type validation must come first.

⚠️ Three Mistakes to Avoid

Mistake 1: Range before type. if age < 0 before .isdigit() crashes on text input. Type first, always.

Mistake 2: Only checking the lower bound. Positive ≠ realistic. Define and check both MIN and MAX.

Mistake 3: Not exiting after a failed check.

# ❌ BAD — program keeps running with bad data
if age < 0:
    print("Error: negative age")

Always follow a failed check with exit(). Fail fast, fail loud, fail clearly.

The Golden Rules of Validation

A validation gate is cheap insurance against expensive bugs.

Type check first — is this the right kind of data?
Lower bound second — is it above the minimum?
Upper bound third — is it below the maximum?

Positive doesn't mean realistic. Now go add a validation gate to your next script. 🐍

Positive doesn't mean realistic. Now go add a validation gate to your next script. 🐍

Mistake 2: Only checking the lower bound. Positive ≠ realistic. Define and check both MIN and MAX.

Mistake 3: Not exiting after a failed check.

python# ❌ BAD — program keeps running with bad data
if age < 0:
print("Error: negative age")

Always follow a failed check with exit(). Fail fast, fail loud, fail clearly.

✅ The Golden Rules of Validation

A validation gate is cheap insurance against expensive bugs.

Type check first — is this the right kind of data?
Lower bound second — is it above the minimum?
Upper bound third — is it below the maximum?

Positive doesn't mean realistic. Now go add a validation gate to your next script. 🐍