"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية إنشاء محادثة تفاعلية لـ Python CLI الخاص بك باستخدام الاستبطان والنقر والتنسيق الغني

كيفية إنشاء محادثة تفاعلية لـ Python CLI الخاص بك باستخدام الاستبطان والنقر والتنسيق الغني

تم النشر بتاريخ 2024-11-08
تصفح:457

How to Build an Interactive Chat for Your Python CLI Using Introspection, Click, and Rich Formatting

إذا كنت ترغب في جعل واجهة سطر الأوامر الخاصة بك أكثر تفاعلية وديناميكية، فقد يكون بناء نظام تفاعل الأوامر في الوقت الفعلي هو الحل. من خلال الاستفادة من إمكانات الاستبطان في Python، والنقر لإدارة الأوامر، وRich لتنسيق المخرجات، يمكنك إنشاء واجهة سطر أوامر (CLI) قوية ومرنة تستجيب بذكاء لإدخال المستخدم. بدلاً من تشفير كل أمر يدويًا، يمكن لسطر الأوامر الخاص بك اكتشاف الأوامر وتنفيذها تلقائيًا، مما يجعل تجربة المستخدم أكثر سلاسة وجاذبية.

فوضى وحدة التحكم الملونة: حيث تجتمع أوامر النقر مع الإخراج الغني — لأنه حتى الجهاز الطرفي يحب التباهي بأناقة!

لماذا استخدام النقر والتخفيض؟

يعمل النقر على تبسيط إدارة الأوامر، وتحليل الوسيطات، وإنشاء المساعدة. كما أنه يسمح بسهولة هيكلة الأوامر والتعامل مع الخيارات.

يمكّنك Rich من إخراج Markdown بتنسيق جميل مباشرةً في الوحدة الطرفية، مما يجعل النتائج ليست وظيفية فحسب، بل أيضًا جذابة بصريًا.

من خلال الجمع بين هاتين المكتبتين مع استبطان Python، يمكنك إنشاء ميزة دردشة تفاعلية تكتشف الأوامر وتنفذها ديناميكيًا أثناء عرض المخرجات بتنسيق غني وقابل للقراءة. للحصول على مثال عملي، راجع كيف يستخدم StoryCraftr نهجًا مشابهًا لتبسيط سير عمل الكتابة المستندة إلى الذكاء الاصطناعي: https://storycraftr.app.

بناء نظام الدردشة التفاعلية

1. إعداد أمر الدردشة الأساسي

يقوم أمر الدردشة بتهيئة الجلسة، مما يسمح للمستخدمين بالتفاعل مع واجهة سطر الأوامر (CLI). هنا، نقوم بالتقاط مدخلات المستخدم، والتي سيتم تعيينها ديناميكيًا لأوامر النقر المناسبة.

import os
import click
import shlex
from rich.console import Console
from rich.markdown import Markdown

console = Console()

@click.command()
@click.option("--project-path", type=click.Path(), help="Path to the project directory")
def chat(project_path=None):
    """
    Start a chat session with the assistant for the given project.
    """
    if not project_path:
        project_path = os.getcwd()

    console.print(
        f"Starting chat for [bold]{project_path}[/bold]. Type [bold green]exit()[/bold green] to quit."
    )

    # Start the interactive session
    while True:
        user_input = console.input("[bold blue]You:[/bold blue] ")

        # Handle exit
        if user_input.lower() == "exit()":
            console.print("[bold red]Exiting chat...[/bold red]")
            break

        # Call the function to handle command execution
        execute_cli_command(user_input)

2. الاستبطان لاكتشاف الأوامر وتنفيذها

باستخدام تحليل لغة بايثون، نكتشف الأوامر المتاحة وننفذها ديناميكيًا. أحد الأجزاء المهمة هنا هو أن أوامر النقر هي وظائف مزخرفة. لتنفيذ المنطق الفعلي، نحتاج إلى استدعاء الدالة غير المزخرفة (أي رد الاتصال).

إليك كيفية تنفيذ الأوامر ديناميكيًا باستخدام الاستبطان والتعامل مع ديكورات Click:

import inspect
import your_project_cmd  # Replace with your actual module containing commands

command_modules = {"project": your_project_cmd}  # List your command modules here

def execute_cli_command(user_input):
    """
    Function to execute CLI commands dynamically based on the available modules,
    calling the undecorated function directly.
    """
    try:
        # Use shlex.split to handle quotes and separate arguments correctly
        parts = shlex.split(user_input)
        module_name = parts[0]
        command_name = parts[1].replace("-", "_")  # Replace hyphens with underscores
        command_args = parts[2:]  # Keep the rest of the arguments as a list

        # Check if the module exists in command_modules
        if module_name in command_modules:
            module = command_modules[module_name]

            # Introspection: Get the function by name
            if hasattr(module, command_name):
                cmd_func = getattr(module, command_name)

                # Check if it's a Click command and strip the decorator
                if hasattr(cmd_func, "callback"):
                    # Call the underlying undecorated function
                    cmd_func = cmd_func.callback

                # Check if it's a callable (function)
                if callable(cmd_func):
                    console.print(
                        f"Executing command from module: [bold]{module_name}[/bold]"
                    )

                    # Directly call the function with the argument list
                    cmd_func(*command_args)
                else:
                    console.print(
                        f"[bold red]'{command_name}' is not a valid command[/bold red]"
                    )
            else:
                console.print(
                    f"[bold red]Command '{command_name}' not found in {module_name}[/bold red]"
                )
        else:
            console.print(f"[bold red]Module {module_name} not found[/bold red]")
    except Exception as e:
        console.print(f"[bold red]Error executing command: {str(e)}[/bold red]")

كيف يعمل هذا؟

  • تحليل الإدخال: نستخدم shlex.split للتعامل مع الإدخال مثل وسيطات سطر الأوامر. وهذا يضمن معالجة السلاسل المقتبسة والأحرف الخاصة بشكل صحيح.
  • البحث عن الوحدة والأوامر: يتم تقسيم الإدخال إلى اسم الوحدة النمطية واسم_الأمر. تتم معالجة اسم الأمر لاستبدال الواصلات بشرطات سفلية لمطابقة أسماء وظائف بايثون.
  • الاستبطان: نستخدم getattr () لجلب وظيفة الأمر ديناميكيًا من الوحدة. إذا كان الأمر Click (أي يحتوي على سمة رد الاتصال)، فإننا نصل إلى منطق الوظيفة الفعلي عن طريق تجريد Click Decorator.
  • تنفيذ الأوامر: بمجرد استرداد الدالة غير المزخرفة، نقوم بتمرير الوسيطات ونسميها، تمامًا كما لو كنا نستدعي دالة بايثون مباشرة.

3. مثال لأوامر واجهة سطر الأوامر (CLI).

دعونا نفكر في بعض نماذج الأوامر ضمن وحدة المشروع التي يمكن للمستخدمين الاتصال بها بشكل تفاعلي عبر الدردشة:

@click.group()
def project():
    """Project management CLI."""
    pass

@project.command()
def init():
    """Initialize a new project."""
    console.print("[bold green]Project initialized![/bold green]")

@project.command()
@click.argument("name")
def create(name):
    """Create a new component in the project."""
    console.print(f"[bold cyan]Component {name} created.[/bold cyan]")

@project.command()
def status():
    """Check the project status."""
    console.print("[bold yellow]All systems operational.[/bold yellow]")

تنفيذ واجهة الدردشة

لتشغيل نظام الدردشة التفاعلية:

  1. تأكد من إدراج الوحدات النمطية الخاصة بك (مثل المشروع) في Command_modules.
  2. قم بتشغيل الأمر:
python your_cli.py chat --project-path /path/to/project

بمجرد بدء الجلسة، يمكن للمستخدمين إدخال أوامر مثل:

You: project init You: project create "Homepage"

سيتم عرض الإخراج بطريقة جيدة التنسيق باستخدام Rich Markdown:

[bold green]Project initialized![/bold green] [bold cyan]Component Homepage created.[/bold cyan]

خاتمة

من خلال الجمع بين النقر لإدارة الأوامر، وتنسيق Rich for Markdown، واستبطان Python، يمكننا إنشاء نظام دردشة قوي وتفاعلي لـ CLIs. يتيح لك هذا الأسلوب اكتشاف الأوامر وتنفيذها ديناميكيًا أثناء تقديم المخرجات بتنسيق أنيق وقابل للقراءة.

النقاط الرئيسية:

  • تنفيذ الأوامر الديناميكية: يمكّنك الاستبطان من اكتشاف الأوامر وتشغيلها دون تشفيرها.
  • إخراج غني: استخدام Rich Markdown يضمن أن المخرجات سهلة القراءة وجذابة بصريًا.
  • المرونة: يتيح هذا الإعداد المرونة في بنية الأوامر والتنفيذ.
بيان الافراج تم إعادة نشر هذه المقالة على: https://dev.to/rodrigo_estrada_79e6022e9/how-to-build-an-interactive-chat-for-your-python-cli-using-introspection-click-and-rich-formatting-4l9a؟ 1. في حالة وجود أي انتهاك، يرجى التواصل مع [email protected] لحذفه.
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3