
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]))
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'))
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