대화형 셸을 맞춤설정하여 메모 앱 만들기

Scrapy나 Django에 있는 것 같은 전용의 대화 쉘을 재현해 봅니다.
그리고 간단한 메모 앱을 만들어 보겠습니다.

환경
python3.9

참고
Scrapy 소스 코드
htps : // 기주 b. 이 m / sc 등 py / sc 등 py / t 어 /

코드 모듈에서 대화형 쉘 시작



코드 모듈에 따르면,code モジュールはread-eval-print (読み込み-評価-表示)ループをPythonで実装するための機能を提供します。対話的なインタプリタプロンプトを提供するアプリケーションを作るために使える二つのクラスと便利な関数が含まれています。
라는 것 같습니다.

분명히 이 모듈을 사용하면 인터랙티브 쉘을 어쩌면 이것이나 할 수 있는 것 같습니다.

scrapy/utils/console.py
def _embed_standard_shell(namespace={}, banner=''):
    """Start a standard python shell"""
    import code
    try:  # readline module is only available on unix systems
        import readline
    except ImportError:
        pass
    else:
        import rlcompleter  # noqa: F401
        readline.parse_and_bind("tab:complete")

    @wraps(_embed_standard_shell)
    def wrapper(namespace=namespace, banner=''):
        code.interact(banner=banner, local=namespace)
    return wrapper


interact 메소드를 사용하여 대화 쉘을 에뮬레이트하는 것 같습니다.
import code

code.interact()

시도해 봅시다.


단 두 줄의 코드로 대화형 쉘을 에뮬레이트 할 수있었습니다.
code.interact(banner=None, readfunc=None, local=None, exitmsg=None)

이 인수 중 scrapy에서 사용되는 bannner와 local에 대해 설명합니다.

banner



string형으로 건네줍니다.
이 인수에 건네준 문자가 쉘 기동시에 표시됩니다.

방금 코드를 조금 수정하여 banner를 변경해 봅시다.
import code

banner = """
Hello!!
My Python Interactive Shell!!
"""

code.interact(banner=banner)



디스플레이 화면이 전환되었습니다!
이것으로 좋아하는 문장을 표시시킬 수 있네요.

local



local 인수에는 사전형을 건네줍니다.
import code

#起動時に表示される
banner = """
Hello!!
My Python Interactive Shell!!
"""

#メソッドの実行
local = {}
def hello_hi():
    return "Hello"

local["hello_hi"] = hello_hi #キーにコマンド名を指定
code.interact(banner=banner, local=local)

방금 전의 코드를 조금 바꾸어 보았습니다.
사전 방법으로 정의한 local에 hello_hi를 키로,
hello_hi 메서드를 참조합니다.

local 변수에 상기와 같은 형태로 건네주는 것으로, 인터랙티브 쉘측에서 import 하지 않아도
직접 메소드를 실행할 수 있게 됩니다.

그럼 실행해 보겠습니다.



실행할 수 있었습니다! !
일부러 import할 필요는 없네요.

간단한 메모 앱 만들기



위를 토대로 자신만의 대화형 한마디 메모 앱을 만들어 보겠습니다.

구현하는 기능은 다음 두 가지뿐입니다.

· 쓰기
· 내용 목록 표시
· 각 방법의 설명

내용의 일람은, 매회 사라져 버려는 메모로서 의미가 없습니다.
그래서 쓴 내용은 sqlite에 저장하도록 합니다.

위의 기능을 가진 MEMO 클래스를 보여줍니다.

MEMO 클래스



shell.py
import sqlite3
import pandas as pd


class MEMO:
    def __init__(self):
        self.conn = sqlite3.connect("memo.db")
        self.c = self.conn.cursor()
        sql = 'SELECT count(*) FROM sqlite_master WHERE type="table" AND name="memo_table"'
        self.c.execute(sql)
        sql = self.c.fetchone()[0]
        if sql == 0:
            self.c.execute("""
            CREATE TABLE memo_table (id INTEGER PRIMARY KEY, 
            date TIMESTAMP DEFAULT (datetime(CURRENT_TIMESTAMP,'localtime')),
            memo TEXT)
            """)


    def write(self, text: str = ""):
        """
        一言メモを記入する
        """
        self.c.execute("""
        INSERT INTO memo_table (memo) values (?)        
        """, (text,))
        self.conn.commit()
        return "記入しました。"

    def display(self):
        """
        メモの一覧を表示
        """
        self.c.execute("""
        SELECT * FROM memo_table 
        """)
        val = {"Date": [], "Memo": []}
        for id, date, memo in self.c.fetchall():
            val["Date"].append(date)
            val["Memo"].append(memo)
        return pd.DataFrame(val)

    def help_memo(self):
        """
        メソッドの説明を表示
        """
        help_comment = \
            """
        write(text: str)
            arg:text
            一言メモを記入する
        display()
            メモの一覧を表示する
        """
        print(help_comment)



먼저 init에서 db에 연결합니다.
이 때 테이블이 없으면 새로 작성하도록 합니다.

기입은 write("기입하는 메모")라고 하는 식으로 기입합니다.
잘 가면 쉘에 "기입했습니다"라고 표시됩니다.

디스플레이는 display()를 사용합니다.
어쩐지 데이터 프레임이 보이기 쉽기 때문에 pandas를 사용하여 데이터 프레임으로 지정합니다.

help_memo에서 각 메소드의 간단한 설명을 볼 수 있습니다.

쉘을 시작하자.


def Shell(banner='', namespace={}):
    import code
    code.interact(banner=banner, local=namespace)  # namespace: dictを渡す

banner 는 기동시에 표시하는 문자입니다.
local에 커멘드를 키로 한 사전형을 건네주고 합니다.

if __name__ == '__main__':
    var = {}  # キー(実行コマンド): メソッドの形で渡す
    m = MEMO()
    # コマンドを設定する
    var["write"] = m.write
    var["display"] = m.display
    var["help_memo"] = m.help_memo

    banner = """
 _人人人人_
 >  My Python Interactive Shell!!  <
  ̄Y^Y^Y^Y ̄
    """  # 起動時に表示される

    Shell(banner=banner, namespace=var)  # shellの起動

메인 부분은 이런 느낌입니다.
사전 형식의 var에 실행 명령을 전달합니다.

또, 여기서 인스턴스를 작성해 두는 것으로, 쉘측에서 일부러 인스턴스를 작성할 필요가 내용으로 해 둡니다.

이렇게 정의한 사전을 Shell에 전달합니다.

준비가 되었으므로 쉘을 시작합시다.



제대로 기입할 수 있네요.
물론 원래는 대화 쉘이므로 다른 파이썬 모듈도 문제없이 사용할 수 있습니다.

이번에 작성한 메모 앱의 소스 코드는 이쪽입니다.
htps : // 기주 b. 코 m / 루 - 1218 / 메모 - ぇ l

좋은 웹페이지 즐겨찾기