@Pythonetc Oktober 2018

gambar

Ini adalah pilihan kelima tips dan pemrograman Python dari umpan @pythonetc saya.

Pilihan sebelumnya:



Pemisah -


Setiap utilitas baris perintah yang layak harus mengambil argumen dalam bentuk opsi (misalnya, -h atau --help ), opsi dengan parameter ( --log-level 2 ) atau parameter posisi ( cp file1 file2 ).

Opsi berbeda dari parameter posisi dengan keberadaan satu atau dua tanda hubung di awal. Ketika argumen posisi dimulai dengan tanda hubung, muncul masalah: jika Anda ingin menghapus file bernama -rf , maka perintah rm -rf tidak akan membantu Anda dengan ini.

Jalan keluar yang mudah adalah dengan menggunakan dua garis putus-putus sebagai pemisah. Argumen setelah - tidak dianggap sebagai opsi:

$ echo test > -rf $ cat -rf cat: invalid option -- 'r' Try 'cat --help' for more information. $ cat -- -rf test $ rm -- -rf $ cat -- -rf cat: -rf: No such file or directory 

Dua strip didukung oleh modul argparse di luar kotak.

Stabilitas stabil


Penyortiran standar dalam Python kuat, fungsi yang diurutkan tidak mengubah urutan objek yang sama:

 In : a = [2, -1, 0, 1, -2] In : sorted(a, key=lambda x: x**2) Out: [0, -1, 1, 2, -2] 

Fungsi min dan maks juga konsisten dengan diurutkan. maks berfungsi seperti diurutkan (a, mundur = Benar) [0] , dan min bekerja seperti diurutkan ( a) [0] . Ini berarti bahwa kedua fungsi mengembalikan jawaban yang paling kiri mungkin:

 In : max([2, -2], key=lambda x: x**2) Out: 2 In : max([-2, 2], key=lambda x: x**2) Out: -2 In : min([2, -2], key=lambda x: x**2) Out: 2 In : min([-2, 2], key=lambda x: x**2) Out: -2 

Tembolok dalam argumen default


Mungkin kesalahan paling umum di antara pythonists pemula adalah untuk menentukan objek bisa berubah sebagai argumen ke fungsi default. Memisahkan objek ini di antara panggilan fungsi dapat menyebabkan hasil yang paling aneh:

 def append_length(lst=[]): lst.append(len(lst)) return lst print(append_length([1, 2])) # [1, 2, 2] print(append_length()) # [0] print(append_length()) # [0, 1] 

Namun, berbagi seperti itu bahkan akan berguna jika Anda menggunakan objek untuk membuat cache bersama:

 def fact(x, cache={0: 1}): if x not in cache: cache[x] = x * fact(x - 1) return cache[x] print(fact(5)) 

Dalam contoh ini, kami menempatkan nilai faktorial yang dihitung di dalam nilai argumen default. Nilai-nilai tersebut bahkan dapat diekstraksi:

 >>> fact.__defaults__ ({0: 1, 1: 1, 2: 2, 3: 6, 4: 24, 5: 120},) 

Bekerja dengan FS


Anda dapat bekerja dengan jalur sistem file menggunakan modul os.path . Modul ini berisi banyak fungsi yang memperlakukan string sebagai path file dan melakukan berbagai operasi yang bermanfaat pada mereka seperti penggabungan:

 >>> import os.path >>> os.path.join('/usr', 'local') '/usr/local' >>> os.path.dirname('/var/log') '/var' 

Dimulai dengan versi 3.4, Python menyertakan modul pathlib yang menawarkan pendekatan berorientasi objek:

 >>> from pathlib import Path >>> Path('/usr') / Path('local') PosixPath('/usr/local') >>> Path('/usr') / 'local' PosixPath('/usr/local') >>> Path('/var/log').parent PosixPath('/var') >>> Path('/var/log').parent.name 'var' 

Obyek yang Disebut


Dalam Python, Anda dapat membuat objek yang dapat dipanggil tidak hanya dengan membuat fungsi (menggunakan sintaks def atau lambda ). Objek menjadi bisa dipanggil jika memiliki metode __call__ :

 class Truncater: def __init__(self, length): self._length = length def __call__(self, s): return s[0:self._length] print(Truncater(4)('abcdabcd')) # abcd 

Karena dekorator pada dasarnya adalah fungsi tingkat tinggi, ia juga dapat diekspresikan oleh objek yang dipanggil, bukan fungsi:

 class cached: def __init__(self, func): self._func = func self._cache = {} def __call__(self, arg): if arg not in self._cache: self._cache[arg] = self._func(arg) return self._cache[arg] @cached def sqr(x): return x * x 

Source: https://habr.com/ru/post/id429186/


All Articles