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 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
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).
Nota: keputusan ini sudah lapuk!
Pelan untuk menyelesaikan cabaran ini adalah seperti berikut:
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
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
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()
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
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).
Ini menambah skrip yang dipanggil oeis, yang memanggil fungsi oeis pada modul oeis. Sekarang, kami menjalankan:
poetry new oeis
yang membolehkan kami memanggil skrip. Jom cuba:
poetry add click
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()
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()
Kini, pelanggan mempunyai url asas yang tidak berubah. Jom selami kaedah lain:
Kami juga perlu mengemas kini fail utama kami, untuk memanggil kaedah ini:
# oeis/pyproject.toml [tool.poetry.scripts] oeis = "oeis:oeis"
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
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
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).
Jika anda menjalankan kod ini, anda akan mendapat ini sekarang:
poetry new oeis
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
Seperti yang anda lihat, kami menambah dua kaedah baharu:
# oeis/oeis/__init__.py import click @click.command() def oeis(): pass if __name__ == "__main__": oeis()
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()
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"
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!