Rumah > pembangunan bahagian belakang > Tutorial Python > Temuduga Jurutera Perisian - #EIS CLI

Temuduga Jurutera Perisian - #EIS CLI

Linda Hamilton
Lepaskan: 2024-11-29 04:55:10
asal
775 orang telah melayarinya

Software Engineer Interviews - #EIS CLI

pengenalan

Ini adalah jawatan ketiga siri Temuduga Jurutera Perisian. Saya telah membawa cabaran yang saya lakukan beberapa tahun lalu, dan sebenarnya mendapat jawatan itu - temu bual teknologi lain terlibat, seperti saringan pengalaman lalu.

Jika anda terlepas siaran sebelumnya pada siri ini, anda boleh menemuinya di sini.

Cabaran

Cabaran ini juga merupakan tugas pengekodan bawa pulang, di mana saya perlu membangunkan program CLI yang akan menanyakan OEIS (Ensiklopedia Integer Dalam Talian) dan mengembalikan jumlah bilangan hasil, dan nama yang pertama lima urutan dikembalikan oleh pertanyaan.

Syukurlah, sistem pertanyaan OEIS termasuk format output JSON, jadi anda boleh mendapatkan keputusan dengan memanggil url dan menghantar urutan sebagai rentetan pertanyaan.

Contoh input dan output:

oeis 1 1 2 3 5 7
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
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).
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Nota: keputusan ini sudah lapuk!

Menyelesaikan Cabaran

Pelan untuk menyelesaikan cabaran ini adalah seperti berikut:

  • Mulakan dengan fail Python yang akan menjadi titik masuk CLI
    • Ia sepatutnya menerima senarai nombor yang dipisahkan oleh ruang sebagai hujah
  • Buat fail klien yang akan bertanggungjawab untuk mengambil data daripada sistem pertanyaan OEIS
  • Pemformat yang akan menjaga pengembalian output yang diformatkan untuk konsol

Memandangkan ini adalah cabaran pengekodan, saya akan menggunakan Puisi untuk membantu saya mencipta struktur projek, dan untuk memudahkan sesiapa sahaja yang menjalankannya. Anda boleh menyemak cara memasang dan menggunakan Puisi di tapak web mereka.

Saya akan mulakan dengan mencipta pakej dengan:

poetry new oeis
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ini akan mencipta folder yang dipanggil oeis, yang akan mengandungi fail konfigurasi Puisi, folder ujian dan folder yang juga dipanggil oeis, yang akan menjadi punca projek kami.

Saya juga akan menambah pakej pilihan, dipanggil Klik, yang membantu membina alatan CLI. Ini tidak diperlukan dan boleh digantikan dengan alatan asli lain daripada Python, walaupun kurang elegan.

Di dalam folder projek, jalankan:

poetry add click
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ini akan menambah klik sebagai pergantungan kepada projek kami.

Kini kita boleh beralih ke fail titik masuk kita. Jika anda membuka folder oeis/oeis, anda akan melihat sudah ada fail __init__.py. Mari kemas kini untuk mengimport Klik, dan fungsi utama untuk dipanggil dengan arahan:

# oeis/oeis/__init__.py

import click


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


if __name__ == "__main__":
    oeis()
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ini adalah titik permulaan kepada CLI kami. Lihat @click.command? Ini ialah pembungkus daripada klik, yang akan membantu kami mentakrifkan oeis sebagai perintah.

Sekarang, ingat kita perlu menerima urutan nombor, dipisahkan oleh ruang? Kita perlu menambah ini sebagai hujah. Klik mempunyai pilihan untuk itu:

oeis 1 1 2 3 5 7
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ini akan menambah hujah yang dipanggil jujukan, dan pilihan nargs=-1 memberitahu klik ia akan dipisahkan oleh ruang. Saya menambah cetakan supaya kita boleh menguji hujah diluluskan dengan betul.

Untuk memberitahu Puisi bahawa kita mempunyai arahan, kita perlu membuka pyproject.toml dan menambah baris berikut:

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).
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ini menambah skrip yang dipanggil oeis, yang memanggil fungsi oeis pada modul oeis. Sekarang, kami menjalankan:

poetry new oeis
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

yang membolehkan kami memanggil skrip. Jom cuba:

poetry add click
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Sempurna, kami mempunyai arahan dan hujah yang dihuraikan seperti yang kami harapkan! Mari kita beralih kepada pelanggan. Di bawah folder oeis/oeis, buat folder bernama klien, fail bernama __init__.py dan fail bernama oeis_client.py.

Jika kami menjangkakan untuk mempunyai pelanggan lain dalam projek ini, kami boleh membangunkan kelas pelanggan asas, tetapi kerana kami hanya akan mempunyai satu ini, ini boleh dianggap sebagai terlalu kejuruteraan. Dalam kelas klien OEIS, kita harus mempunyai URL asas, iaitu URL tanpa laluan dan yang akan kita gunakan untuk menanyakannya:

# oeis/oeis/__init__.py

import click


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


if __name__ == "__main__":
    oeis()
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Seperti yang anda lihat, kami mengimport pakej permintaan. Kita perlu menambahkannya pada Puisi sebelum kita boleh menggunakannya:

# oeis/oeis/__init__.py

import click


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


if __name__ == "__main__":
    oeis()
Salin selepas log masuk
Salin selepas log masuk

Kini, pelanggan mempunyai url asas yang tidak berubah. Jom selami kaedah lain:

  • build_url_params
    • Menerima urutan yang diluluskan sebagai hujah daripada CLI dan mengubahnya menjadi rentetan nombor yang dipisahkan dengan koma
    • Membina dict dengan params, q ialah pertanyaan yang akan kami jalankan dan fmt ialah format output yang diharapkan
    • Akhir sekali, kami mengembalikan versi params yang dikodkan URL, yang merupakan cara yang baik untuk memastikan rentetan kami serasi dengan URL
  • query_results
    • Menerima urutan yang diluluskan sebagai hujah daripada CLI, membina param yang dikodkan url melalui kaedah build_url_params
    • Membina URL penuh yang akan digunakan untuk menanyakan data
    • Teruskan dengan permintaan ke URL yang dibina dan dinaikkan untuk sebarang status HTTP yang tidak kami jangka
    • Mengembalikan data JSON

Kami juga perlu mengemas kini fail utama kami, untuk memanggil kaedah ini:

# oeis/pyproject.toml

[tool.poetry.scripts]
oeis = "oeis:oeis"
Salin selepas log masuk
Salin selepas log masuk

Di sini kami sedang membina contoh klien, di luar kaedah, jadi ia tidak mencipta tika setiap kali arahan dipanggil dan memanggilnya di dalam arahan.

Menjalankan ini menghasilkan respons yang sangat panjang, memandangkan OEIS mempunyai beribu-ribu penyertaan. Memandangkan kami hanya perlu mengetahui jumlah saiz dan lima penyertaan teratas, kami boleh melakukan perkara berikut:

poetry install
Salin selepas log masuk

Menjalankan ini sudah jauh lebih baik daripada sebelumnya. Kami kini mencetak jumlah saiz, dan penyertaan lima teratas (jika wujud).

Tetapi kami juga tidak memerlukan semua itu. Mari kita bina pemformat untuk memformat output kita dengan betul. Buat folder yang dipanggil pemformat, yang akan mempunyai fail __init__.py dan fail oeis_formatter.py.

oeis 1 1 2 3 5 7
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Fail ini pada asasnya memformat lima hasil teratas ke dalam apa yang kita mahukan untuk output. Mari gunakannya dalam fail utama kami:

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).
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Jika anda menjalankan kod ini, anda akan mendapat ini sekarang:

poetry new oeis
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ia kini kembali dengan format yang kami jangkakan, tetapi perhatikan bahawa ia mengatakan ia menemui 10 hasil. Ini adalah salah, jika anda mencari di laman web OEIS anda akan melihat terdapat lebih banyak hasil. Malangnya, terdapat kemas kini kepada API OEIS dan hasilnya tidak lagi mengembalikan kiraan dengan bilangan hasil. Kiraan ini masih muncul pada output berformat teks, walaupun. Kita boleh menggunakannya untuk mengetahui berapa banyak keputusan yang ada.

Untuk melakukan ini, kita boleh menukar URL untuk menggunakan fmt=text, dan regex untuk mencari nilai yang kita inginkan. Mari kemas kini kod pelanggan untuk mengambil data teks dan pemformat untuk menggunakan data ini supaya kami boleh mengeluarkannya.

poetry add click
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Seperti yang anda lihat, kami menambah dua kaedah baharu:

  • get_count
    • Akan membina params untuk API teks, dan menyerahkannya kepada kaedah yang akan menggunakan regex untuk mencari nombor yang kami cari
  • get_response_count
    • Akan menggunakan regex terbina dalam init kelas untuk melakukan carian dan mendapatkan kumpulan pertama
# oeis/oeis/__init__.py

import click


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


if __name__ == "__main__":
    oeis()
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dalam fail ini, kami hanya menambah param baharu untuk kaedah tersebut dan menggunakannya dan bukannya panjang hasil pertanyaan.

# oeis/oeis/__init__.py

import click


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


if __name__ == "__main__":
    oeis()
Salin selepas log masuk
Salin selepas log masuk

Di sini kami hanya memanggil kaedah baharu pada klien, dan menyampaikan maklumat kepada pemformat. Menjalankannya semula menghasilkan output yang kami jangkakan:

# oeis/pyproject.toml

[tool.poetry.scripts]
oeis = "oeis:oeis"
Salin selepas log masuk
Salin selepas log masuk

Kod pada dasarnya sudah sedia. Tetapi untuk cabaran sebenar, ingat untuk menggunakan Git apabila boleh, lakukan komitmen kecil dan sudah tentu, tambahkan ujian unit, lib pemformatan kod, penyemak taip dan apa sahaja yang anda rasa anda perlukan.

Semoga berjaya!

Atas ialah kandungan terperinci Temuduga Jurutera Perisian - #EIS CLI. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan