ホームページ >バックエンド開発 >Python チュートリアル >ソフトウェア エンジニアのインタビュー - #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).
注: この結果は古いです!
この課題を解決するための計画は次のとおりです:
これはコーディングの課題であるため、プロジェクトの構造を作成し、プロジェクトの実行を容易にするために 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 が設定されました。他のメソッドを見てみましょう:
このメソッドを呼び出すために、メイン ファイルも更新する必要があります。
# 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 つの新しいメソッドが追加されました。
# 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 サイトの他の関連記事を参照してください。