Dies ist der dritte Beitrag der Reihe „Software Engineer Interviews“. Ich habe eine Herausforderung mitgebracht, die ich vor ein paar Jahren gemeistert habe, und tatsächlich die Stelle bekommen – andere technische Vorstellungsgespräche waren beteiligt, beispielsweise ein Screening früherer Erfahrungen.
Wenn Sie die vorherigen Beiträge dieser Serie verpasst haben, finden Sie sie hier.
Diese Herausforderung war auch eine Programmieraufgabe zum Mitnehmen, bei der ich ein CLI-Programm entwickeln musste, das die OEIS (Online-Enzyklopädie ganzzahliger Sequenzen) abfragt und die Gesamtzahl der Ergebnisse sowie den Namen des ersten Ergebnisses zurückgibt Fünf von der Abfrage zurückgegebene Sequenzen.
Glücklicherweise verfügt das OEIS-Abfragesystem über ein JSON-Ausgabeformat, sodass Sie die Ergebnisse erhalten können, indem Sie die URL aufrufen und die Sequenz als Abfragezeichenfolge übergeben.
Beispiel für Eingabe und Ausgabe:
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).
Hinweis: Dieses Ergebnis ist veraltet!
Der Plan zur Lösung dieser Herausforderung ist folgender:
Da es sich hierbei um eine Programmierherausforderung handelt, werde ich Poetry verwenden, um die Struktur des Projekts zu erstellen und es jedem zu erleichtern, es auszuführen. Sie können auf ihrer Website nachlesen, wie Sie Poetry installieren und verwenden.
Ich erstelle zunächst das Paket mit:
poetry new oeis
Dadurch wird ein Ordner namens oeis erstellt, der die Konfigurationsdatei der Poetry, einen Testordner und einen Ordner namens oeis enthält, der das Stammverzeichnis unseres Projekts sein wird.
Ich werde außerdem ein optionales Paket namens Click hinzufügen, das beim Erstellen von CLI-Tools hilft. Dies ist nicht erforderlich und kann durch andere native Tools von Python ersetzt werden, wenn auch weniger elegant.
Führen Sie im Projektordner Folgendes aus:
poetry add click
Dadurch wird Click als Abhängigkeit zu unserem Projekt hinzugefügt.
Jetzt können wir zu unserer Einstiegspunktdatei wechseln. Wenn Sie den Ordner oeis/oeis öffnen, sehen Sie, dass dort bereits eine __init__.py-Datei vorhanden ist. Aktualisieren wir es, um Click zu importieren, und eine Hauptfunktion, die mit dem Befehl aufgerufen werden soll:
# oeis/oeis/__init__.py import click @click.command() def oeis(): pass if __name__ == "__main__": oeis()
Dies ist der Ausgangspunkt unserer CLI. Sehen Sie den @click.command? Dies ist ein Wrapper von Click, der uns dabei hilft, oeis als Befehl zu definieren.
Denken Sie daran, dass wir die Zahlenfolge, getrennt durch ein Leerzeichen, empfangen müssen? Wir müssen dies als Argument hinzufügen. Click hat dafür eine Option:
oeis 1 1 2 3 5 7
Dadurch wird ein Argument namens „sequence“ hinzugefügt, und die Option „nargs=-1“ weist an, dass es durch Leerzeichen getrennt wird. Ich habe einen Ausdruck hinzugefügt, damit wir testen können, ob das Argument korrekt übergeben wird.
Um Poetry mitzuteilen, dass wir einen Befehl haben, müssen wir pyproject.toml öffnen und die folgenden Zeilen hinzufügen:
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).
Hiermit wird ein Skript namens oeis hinzugefügt, das die oeis-Funktion im oeis-Modul aufruft. Jetzt führen wir Folgendes aus:
poetry new oeis
Damit können wir das Skript aufrufen. Probieren wir es aus:
poetry add click
Perfekt, wir haben den Befehl und die Argumente wie erwartet analysiert! Kommen wir zum Kunden. Erstellen Sie im Ordner „oeis/oeis“ einen Ordner namens „clients“, eine Datei namens „__init__.py“ und eine Datei namens „oeis_client.py“.
Wenn wir in diesem Projekt andere Clients erwarten würden, könnten wir eine Basis-Client-Klasse entwickeln, aber da wir nur diesen einzigen haben werden, könnte dies als Over-Engineering angesehen werden. In der OEIS-Client-Klasse sollten wir eine Basis-URL haben, also die URL ohne die Pfade, die wir zur Abfrage verwenden werden:
# oeis/oeis/__init__.py import click @click.command() def oeis(): pass if __name__ == "__main__": oeis()
Wie Sie sehen können, importieren wir das Anforderungspaket. Wir müssen es zu Poetry hinzufügen, bevor wir es verwenden können:
# oeis/oeis/__init__.py import click @click.command() @click.argument("sequence", nargs=-1) def oeis(sequence: tuple[str]): print(sequence) if __name__ == "__main__": oeis()
Jetzt hat der Client eine Basis-URL, die sich nicht ändert. Lassen Sie uns in die anderen Methoden eintauchen:
Wir müssen auch unsere Hauptdatei aktualisieren, um diese Methode aufzurufen:
# oeis/pyproject.toml [tool.poetry.scripts] oeis = "oeis:oeis"
Hier erstellen wir jetzt eine Client-Instanz außerhalb der Methode, damit nicht jedes Mal, wenn der Befehl aufgerufen wird, eine Instanz erstellt wird, und rufen sie innerhalb des Befehls auf.
Dies führt zu einer sehr, sehr langen Antwort, da das OEIS Tausende von Einträgen hat. Da wir nur die Gesamtgröße und die fünf besten Einträge kennen müssen, können wir Folgendes tun:
poetry install
Das Laufen ist jetzt schon viel besser als zuvor. Wir drucken nun die Gesamtgröße und die fünf obersten Einträge (falls vorhanden) aus.
Aber das alles brauchen wir auch nicht. Lassen Sie uns einen Formatierer erstellen, um unsere Ausgabe korrekt zu formatieren. Erstellen Sie einen Ordner namens formatters, der eine __init__.py-Datei und eine oeis_formatter.py-Datei enthält.
oeis 1 1 2 3 5 7
Diese Datei formatiert im Wesentlichen die fünf besten Ergebnisse in das, was wir für die Ausgabe wünschen. Verwenden wir es in unserer Hauptdatei:
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).
Wenn Sie diesen Code ausführen, erhalten Sie jetzt Folgendes:
poetry new oeis
Es kehrt jetzt mit dem von uns erwarteten Format zurück. Beachten Sie jedoch, dass dort angezeigt wird, dass 10 Ergebnisse gefunden wurden. Das ist falsch. Wenn Sie auf der OEIS-Website suchen, werden Sie feststellen, dass es viel mehr Ergebnisse gibt. Leider gab es ein Update der OEIS-API und das Ergebnis gibt keine Zählung mehr mit der Anzahl der Ergebnisse zurück. Diese Zahl wird jedoch weiterhin in der textformatierten Ausgabe angezeigt. Wir können damit wissen, wie viele Ergebnisse es gibt.
Dazu können wir die URL ändern, um fmt=text und einen regulären Ausdruck zu verwenden, um den gewünschten Wert zu finden. Aktualisieren wir den Client-Code, um die Textdaten abzurufen, und den Formatierer, um diese Daten zu verwenden, damit wir sie ausgeben können.
poetry add click
Wie Sie sehen können, haben wir zwei neue Methoden hinzugefügt:
# oeis/oeis/__init__.py import click @click.command() def oeis(): pass if __name__ == "__main__": oeis()
In dieser Datei haben wir nur einen neuen Parameter für die Methode hinzugefügt und ihn anstelle der Länge des Abfrageergebnisses verwendet.
# oeis/oeis/__init__.py import click @click.command() @click.argument("sequence", nargs=-1) def oeis(sequence: tuple[str]): print(sequence) if __name__ == "__main__": oeis()
Hier rufen wir einfach die neue Methode auf dem Client auf und übergeben die Informationen an den Formatierer. Eine erneute Ausführung führt zu der erwarteten Ausgabe:
# oeis/pyproject.toml [tool.poetry.scripts] oeis = "oeis:oeis"
Der Code ist grundsätzlich fertig. Aber für eine echte Herausforderung denken Sie daran, nach Möglichkeit Git zu verwenden, kleine Commits durchzuführen und natürlich Unit-Tests, Code-Formatierungsbibliotheken, Typprüfer und alles, was Sie sonst noch für nötig halten, hinzuzufügen.
Viel Glück!
Das obige ist der detaillierte Inhalt vonVorstellungsgespräche für Softwareentwickler – #EIS CLI. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!