ホームページ >バックエンド開発 >Python チュートリアル >ソフトウェア エンジニアのインタビュー - #EIS CLI

ソフトウェア エンジニアのインタビュー - #EIS CLI

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-29 04:55:10776ブラウズ

Software Engineer Interviews - #EIS CLI

導入

これは、ソフトウェア エンジニアのインタビュー シリーズの 3 回目の投稿です。私は数年前にチャレンジしたことを持参し、実際にそのポジションを獲得しました。過去の経験選考など、他の技術面の面接も含まれていました。

このシリーズの以前の投稿を見逃した場合は、ここで見つけることができます。

挑戦

この課題は持ち帰り用のコーディング タスクでもあり、OEIS (整数シーケンスのオンライン百科事典) にクエリを実行し、結果の総数と最初の結果の名前を返す CLI プログラムを開発する必要がありました。クエリによって返された 5 つのシーケンス。

ありがたいことに、OEIS クエリ システムには JSON 出力形式が含まれているため、URL を呼び出し、シーケンスをクエリ文字列として渡すことで結果を取得できます。

入力と出力の例:

oeis 1 1 2 3 5 7
Found 1096 results. Showing first five:
1. The prime numbers.
2. a(n) is the number of partitions of n (the partition numbers).
3. Prime numbers at the beginning of the 20th century (today 1 is no longer regarded as a prime).
4. Palindromic primes: prime numbers whose decimal expansion is a palindrome.
5. a(n) = floor(3^n / 2^n).

注: この結果は古いです!

課題を解決する

この課題を解決するための計画は次のとおりです:

  • CLI エントリポイントとなる Python ファイルから始めます
    • 引数としてスペースで区切られた数値のリストを受け取る必要があります
  • OEIS クエリ システムからデータをフェッチするクライアント ファイルを作成します
  • コンソール用にフォーマットされた出力を返す処理を行うフォーマッタ

これはコーディングの課題であるため、プロジェクトの構造を作成し、プロジェクトの実行を容易にするために Poetry を使用します。 Poetry のインストール方法と使用方法は Web サイトで確認できます。

まず、次のパッケージを作成します。

poetry new oeis

これにより、oeis というフォルダーが作成されます。このフォルダーには、詩の構成ファイル、テスト フォルダー、およびプロジェクトのルートとなる oeis というフォルダーも含まれます。

CLI ツールの構築に役立つ Click というオプションのパッケージも追加します。これは必須ではなく、あまり洗練されていませんが、Python の他のネイティブ ツールで置き換えることができます。

プロジェクトのフォルダー内で次のコマンドを実行します。

poetry add click

これにより、クリックが依存関係としてプロジェクトに追加されます。

これで、エントリポイント ファイルに移動できます。 oeis/oeis フォルダーを開くと、すでに __init__.py ファイルがあることがわかります。 Click をインポートし、次のコマンドで main 関数を呼び出すように更新しましょう:

# oeis/oeis/__init__.py

import click


@click.command()
def oeis():
    pass


if __name__ == "__main__":
    oeis()

これが CLI の開始点です。 @click.コマンドを参照してください。これは click のラッパーで、oeis をコマンドとして定義するのに役立ちます。

さて、スペースで区切られた一連の数字を受け取る必要があることを思い出してください。これを引数として追加する必要があります。クリックにはそのためのオプションがあります:

oeis 1 1 2 3 5 7

これにより、sequence という引数が追加され、nargs=-1 オプションはクリックにスペースで区切られるように指示します。引数が正しく渡されているかどうかをテストできるように、出力を追加しました。

Poetry にコマンドがあることを伝えるには、pyproject.toml を開いて次の行を追加する必要があります:

Found 1096 results. Showing first five:
1. The prime numbers.
2. a(n) is the number of partitions of n (the partition numbers).
3. Prime numbers at the beginning of the 20th century (today 1 is no longer regarded as a prime).
4. Palindromic primes: prime numbers whose decimal expansion is a palindrome.
5. a(n) = floor(3^n / 2^n).

これは、oeis モジュールの oeis 関数を呼び出す oeis というスクリプトを追加しています。ここで、次を実行します:

poetry new oeis

これにより、スクリプトを呼び出すことができます。試してみましょう:

poetry add click

完璧です。コマンドと引数が期待どおりに解析されています。クライアントの話に移りましょう。 oeis/oeis フォルダーの下に、clients というフォルダー、__init__.py というファイル、および oeis_client.py というファイルを作成します。

このプロジェクトに他のクライアントが含まれることが予想される場合は、基本クライアント クラスを開発できますが、このクラスしか持たないため、これはオーバーエンジニアリングとみなされる可能性があります。 OEIS クライアント クラスには、パスを除いた URL であるベース URL が必要です。これをクエリに使用します。

# oeis/oeis/__init__.py

import click


@click.command()
def oeis():
    pass


if __name__ == "__main__":
    oeis()

ご覧のとおり、リクエスト パッケージをインポートしています。使用する前に、Poetry に追加する必要があります:

# oeis/oeis/__init__.py

import click


@click.command()
@click.argument("sequence", nargs=-1)
def oeis(sequence: tuple[str]):
    print(sequence)


if __name__ == "__main__":
    oeis()

これで、クライアントには変更されないベース URL が設定されました。他のメソッドを見てみましょう:

  • build_url_params
    • CLI から引数として渡されたシーケンスを受け取り、それをカンマで区切られた数値の文字列に変換します
    • パラメータを使用して辞書を構築します。q は実行するクエリ、fmt は予想される出力形式です
    • 最後に、URL エンコードされたバージョンの params を返します。これは、文字列が URL と互換性があることを確認する優れた方法です
  • クエリ結果
    • CLI から引数として渡されたシーケンスを受け取り、build_url_params メソッドを通じて URL エンコードされたパラメータを構築します
    • データのクエリに使用される完全な URL を構築します
    • 構築された URL へのリクエストを続行し、予期しない HTTP ステータスを発生させます
    • JSON データを返します

このメソッドを呼び出すために、メイン ファイルも更新する必要があります。

# oeis/pyproject.toml

[tool.poetry.scripts]
oeis = "oeis:oeis"

ここでは、メソッドの外側でクライアント インスタンスを構築しています。これにより、コマンドが呼び出されるたびにインスタンスが作成されるのではなく、コマンド内でインスタンスが呼び出されます。

OEIS には数千のエントリがあるため、これを実行すると非常に長い応答が発生します。合計サイズと上位 5 つのエントリのみを知る必要があるため、次のことができます:

poetry install

これを実行すると、以前よりもはるかに優れています。ここで、合計サイズと、上位 5 つのエントリ (存在する場合) を出力します。

しかし、それらすべてが必要なわけでもありません。出力を正しくフォーマットするフォーマッタを構築しましょう。 formatters というフォルダーを作成します。このフォルダーには、__init__.py ファイルと oeis_formatter.py ファイルが含まれます。

oeis 1 1 2 3 5 7

このファイルは基本的に、上位 5 つの結果を出力に必要なものにフォーマットします。これをメインファイルで使用してみましょう:

Found 1096 results. Showing first five:
1. The prime numbers.
2. a(n) is the number of partitions of n (the partition numbers).
3. Prime numbers at the beginning of the 20th century (today 1 is no longer regarded as a prime).
4. Palindromic primes: prime numbers whose decimal expansion is a palindrome.
5. a(n) = floor(3^n / 2^n).

このコードを実行すると、次の結果が得られます:

poetry new oeis

期待した形式で返されていますが、10 件の結果が見つかったと表示されていることに注目してください。これは間違いです。OEIS Web サイトで検索すると、さらに多くの結果があることがわかります。残念ながら、OEIS API が更新され、結果は結果の数を含むカウントを返さなくなりました。ただし、このカウントはテキスト形式の出力には引き続き表示されます。これを使用して、結果がいくつあるかを知ることができます。

これを行うには、fmt=text を使用するように URL を変更し、必要な値を見つけるために正規表現を使用します。クライアント コードを更新してテキスト データを取得し、フォーマッタを更新してこのデータを使用して出力できるようにしましょう。

poetry add click

ご覧のとおり、2 つの新しいメソッドが追加されました。

  • get_count
    • テキスト API のパラメータを構築し、それを正規表現を使用して検索している番号を見つけるメソッドに渡します
  • get_response_count
    • クラスの初期化に組み込まれた正規表現を使用して検索を実行し、最初のグループを取得します
# oeis/oeis/__init__.py

import click


@click.command()
def oeis():
    pass


if __name__ == "__main__":
    oeis()

このファイルでは、メソッドの新しいパラメータのみを追加し、クエリ結果の長さの代わりにそれを使用しました。

# oeis/oeis/__init__.py

import click


@click.command()
@click.argument("sequence", nargs=-1)
def oeis(sequence: tuple[str]):
    print(sequence)


if __name__ == "__main__":
    oeis()

ここでは、クライアント上で新しいメソッドを呼び出し、情報をフォーマッタに渡しているだけです。再度実行すると、期待していた出力が得られます。

# oeis/pyproject.toml

[tool.poetry.scripts]
oeis = "oeis:oeis"

コードは基本的に準備ができています。しかし、実際の課題に取り組む場合は、可能な限り Git を使用し、小さなコミットを実行し、もちろん単体テスト、コード フォーマット ライブラリ、型チェッカー、その他必要と思われるものはすべて追加することを忘れないでください。

頑張ってください!

以上がソフトウェア エンジニアのインタビュー - #EIS CLIの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。