operasi font yang ramah di atas fontTools
. ?
pip instal python-fontbro
Cukup impor kelas font:
dari fontbro import Fontfont = Font("fonts/MyFont.ttf")# atau Anda dapat menggunakan objek seperti file apa pun:dengan open("fonts/MyFont.ttf") sebagai fh:font = Font(fh)
clone
close
from_collection
get_characters
get_characters_count
get_family_classification
get_family_name
get_features
get_features_tags
get_filename
get_fingerprint
get_fingerprint_match
get_format
get_glyphs
get_glyphs_count
get_image
get_italic_angle
get_name
get_names
get_style_flag
get_style_flags
get_style_name
get_svg
get_ttfont
get_unicode_block_by_name
get_unicode_blocks
get_unicode_script_by_name
get_unicode_scripts
get_variable_axes
get_variable_axes_tags
get_variable_axis_by_tag
get_variable_instances
get_variable_instance_by_style_name
get_variable_instance_closest_to_coordinates
get_version
get_vertical_metrics
get_weight
get_width
is_color
is_monospace
is_static
is_variable
rename
sanitize
save
save_as_woff
save_as_woff2
save_to_file_object
save_variable_instances
set_family_classification
set_family_name
set_name
set_names
set_style_flag
set_style_flags
set_style_flags_by_subfamily_name
set_style_name
set_vertical_metrics
subset
to_sliced_variable
to_static
clone
"""Membuat instance Font baru yang membaca file biner yang sama."""font_clone = font.clone()
close
"""Tutup instance TTFont yang dibungkus."""font.close()
from_collection
"""Mendapatkan daftar objek Font dari file koleksi font (.ttc / .otc):param filepath: Filepath:type filepath: str atau pathlib.Path:returns: Daftar objek Font.:rtype: list" ""font = Font.from_collection(filepath="my-font-collection.ttc")
get_characters
"""Mendapatkan karakter font.:param abaikan_blank: Jika Benar, karakter tanpa kontur tidak akan dikembalikan.:type abaikan_blank: bool:returns: Karakter.:rtype: generator dicts:raises TypeError: Jika tidak mungkin ditemukan dict cmap unicode 'terbaik' di font."""chars = font.get_characters(ignore_blank=False)
get_characters_count
"""Mendapatkan jumlah karakter font.:param abaikan_blank: Jika Benar, karakter tanpa kontur tidak akan dihitung.:type abaikan_blank: bool:returns: Karakter dihitung.:rtype: int"""chars_count = font.get_characters_count(ignore_blank =Salah)
get_family_classification
"""Mendapatkan info klasifikasi jenis font yang membaca bidang sFamilyClass dari tabel OS/2. Jika tabel OS/2 tidak tersedia Tidak ada yang dikembalikan.:returns: Kamus yang berisi info klasifikasi jenis font, misalnya { "nama_lengkap": "Sans Serif / Neo-grotesque Gothic", "class_id": 8, "class_name": "Sans Serif", "subclass_id": 5, "subclass_name": "Neo-grotesque Gotik", }:rtype: dict"""family_classification = font.get_family_classification()
get_family_name
"""Mendapatkan nama keluarga membaca catatan nama dengan urutan prioritas (16, 21, 1).:returns: Nama keluarga font.:rtype: str"""family_name = font.get_family_name()
get_features
"""Mendapatkan fitur tipe terbuka font.:returns: Fitur.:rtype: daftar dict"""features = font.get_features()
get_features_tags
"""Mendapatkan tag fitur tipe terbuka font.:returns: Daftar tag fitur.:rtype: daftar str"""features_tags = font.get_features_tags()
get_filename
"""Mendapatkan nama file yang akan digunakan untuk menyimpan font ke sistem file.:param variabel_suffix: Akhiran variabel, default "Variable":tipe variabel_suffix: str:param variabel_axes_tags: Tandai tag sumbu variabel, jika Benar, tag sumbu akan ditambahkan, misalnya '[wght,wdth]':type variabel_axes_tags: bool:param variabel_axes_values: The nilai sumbu variabel ditandai jika Benar, setiap nilai sumbu akan ditambahkan, misalnya '[wght(100,100,900),wdth(75,100,125)]':ketik variabel_axes_values: bool:returns: Nama file.:rtype: str"""nama file = font. get_filename(variable_suffix="Variabel", variabel_axes_tags=Benar, variabel_axes_values=Salah)
get_fingerprint
"""Mendapatkan sidik jari font: hash dihitung dari representasi gambar font. Mengubah opsi teks mempengaruhi sidik jari yang dikembalikan.:teks param: Teks yang digunakan untuk menghasilkan sidik jari, nilai default: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".:ketik teks : str:returns: Hash sidik jari.:rtype: imagehash.ImageHash"""hash = font.get_fingerprint()
get_fingerprint_match
"""Mendapatkan kecocokan sidik jari antara font ini dan font lainnya. dengan memeriksa apakah sidik jarinya sama (perbedaan <= toleransi).:param other: Font lainnya, dapat berupa jalur file atau instance Font.:type other: str atau Font:toleransi param: Toleransi perbedaan, default 3.:toleransi tipe: int:param teks: Teks yang digunakan untuk menghasilkan sidik jari, nilai default: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".:ketik teks: str:returns: Tuple berisi info kecocokan (match, diff, hash, other_hash).:rtype: tuple"""match, diff, hash, other_hash = font.get_fingerprint_match(other=" other_font.ttf", toleransi=10)
get_format
"""Mendapatkan format font: otf, ttf, woff, woff2.:param abaikan_flavor: Jika Benar, format asli tanpa kompresi akan dikembalikan.:type abaikan_flavor: bool:returns: Format.:rtype: str atau Tidak Ada" ""format = font.get_format(ignore_flavor=Salah)
get_glyphs
"""Mendapatkan mesin terbang font dan komposisinya sendiri.:returns: Mesin terbang.:rtype: generator dicts"""glyphs = font.get_glyphs()
get_glyphs_count
"""Mendapatkan jumlah mesin terbang font.:returns: Jumlah mesin terbang.:rtype: int"""glyphs_count = font.get_glyphs_count()
get_image
"""Mendapatkan representasi gambar dari font yang merender beberapa teks menggunakan opsi yang diberikan.:param text: Teks yang dirender dalam gambar:type text: str:param size: The font size:type size: int:param color: The text warna:ketik warna: tuple:param background_color: Warna latar belakang:ketik background_color: tuple"""img = font.get_image(text="Halo!", ukuran=48, warna=(0, 0, 0, 255), warna_latar=(255, 255, 255, 255))
get_italic_angle
"""Mendapatkan sudut font miring.:returns: Nilai sudut termasuk bendera miring ke belakang, miring, dan roman.:rtype: dict atau Tidak Ada"""italic_angle = font.get_italic_angle()
get_name
"""Mendapatkan nama berdasarkan pengidentifikasinya dari tabel nama font.:param key: Nama id atau kunci (mis. "family_name"):type key: int atau str:returns: The name.:rtype: str atau None :menaikkan KeyError: jika kunci bukan nama yang valid kunci/id"""nama_keluarga = font.get_name(key=Font.NAME_FAMILY_NAME)
get_names
"""Mendapatkan rekaman nama yang dipetakan berdasarkan propertinya name.:returns: Thenames.:rtype: dict"""names = font.get_names()
get_style_flag
"""Mendapatkan flag gaya yang membaca tabel OS/2 dan macStyle.:param key: The key:type key: string:returns: The style flag.:rtype: bool"""flag = font.get_style_flag(Font.STYLE_FLAG_BOLD)
get_style_flags
"""Mendapatkan flag gaya yang membaca tabel OS/2 dan macStyle.:returns: Dict yang mewakili flag gaya.:rtype: dict"""flags = font.get_style_flags()
get_style_name
"""Mendapatkan nama gaya membaca catatan nama dengan urutan prioritas (17, 22, 2).:returns: Nama gaya font.:rtype: str"""style_name = font.get_style_name()
get_svg
"""Mendapatkan representasi SVG dari font yang merender beberapa teks menggunakan opsi yang diberikan.:param text: Teks yang akan dirender sebagai jalur SVG.:type text: str:param size: Ukuran font yang akan digunakan untuk merender teks teks, dalam poin.:type size: int:returns: String SVG yang mewakili teks yang dirender.:rtype: str"""svg_str = font.get_svg(text="Halo!", size=48)
get_ttfont
"""Mendapatkan contoh TTFont yang dibungkus.:returns: Contoh TTFont.:rtype: TTFont"""ttfont = font.get_ttfont()
get_unicode_block_by_name
"""Mendapatkan blok unicode berdasarkan nama (nama tidak peka huruf besar-kecil dan mengabaikan "-").:nama param: Nama:ketik nama: str:returns: Dict blok unicode jika nama tersebut valid, Tidak ada yang sebaliknya.: rtype: dict atau Tidak Ada"""block = font.get_unicode_block_by_name(name="Basic Latin")
get_unicode_blocks
"""Mendapatkan blok unicode dan cakupannya. Hanya blok dengan cakupan >= coverage_threshold (0.0 <= coverage_threshold <= 1.0) yang akan dikembalikan.:param coverage_threshold: Cakupan minimum yang diperlukan agar sebuah blok dapat dikembalikan.:type coverage_threshold: float:returns: Daftar blok unicode.:rtype: daftar dicts"""blocks = font.get_unicode_blocks(ambang_cakupan=0,00001)
get_unicode_script_by_name
"""Mendapatkan skrip unicode berdasarkan nama/tag (nama/tag tidak peka huruf besar-kecil dan mengabaikan "-").:param name: Nama:tipe nama: str:returns: Dict skrip unicode jika nama/tag adalah valid, Tidak ada sebaliknya.:rtype: dict atau Tidak Ada"""script = font.get_unicode_script_by_name(name="Latn")
get_unicode_scripts
"""Mendapatkan skrip unicode dan cakupannya. Hanya skrip dengan cakupan >= coverage_threshold (0,0 <= coverage_threshold <= 1.0) yang akan dikembalikan.:param coverage_threshold: Cakupan minimum yang diperlukan agar skrip dapat dikembalikan.:type coverage_threshold: float:returns: Daftar skrip unicode.:rtype: daftar dicts"""scripts = font.get_unicode_scripts(ambang_cakupan=0,00001)
get_variable_axes
"""Mendapatkan variabel font axes.:returns: Daftar sumbu jika font adalah variabel font sebaliknya Tidak Ada.:rtype: daftar dict atau Tidak Ada"""axes = font.get_variable_axes()
get_variable_axes_tags
"""Mendapatkan tag sumbu variabel.:returns: Tag sumbu variabel.:rtype: list or None"""axes_tags = font.get_variable_axes_tags()
get_variable_axis_by_tag
"""Mendapatkan sumbu variabel dengan tag.:param tag: Tag:type tag: string:returns: Variabel sumbu dengan tag.:rtype: dict atau Tidak Ada"""axis = font.get_variable_axis_by_tag(tag="wght" )
get_variable_instances
"""Mendapatkan variabel instances.:returns: Daftar instance jika font adalah variabel font sebaliknya Tidak ada.:rtype: daftar dict atau Tidak Ada"""instances = font.get_variable_instances()
get_variable_instance_by_style_name
"""Mendapatkan contoh variabel berdasarkan nama gaya, misalnya style_name = 'Bold':param style_name: Nama gaya:type style_name: str:returns: Contoh variabel yang cocok dengan nama gaya yang diberikan.:rtype: dict atau Tidak Ada"" "instance = font.get_variable_instance_by_style_name(style_name="Bold")
get_variable_instance_closest_to_coordinates
"""Mendapatkan instance variabel yang paling dekat dengan koordinat, misalnya koordinat = {"wght": 1000, "slnt": 815, "wdth": 775}Jika koordinat tidak menentukan beberapa sumbu, nilai default sumbu digunakan untuk pencarian. :param koordinat: Koordinat:tipe koordinat: dict:returns: Contoh variabel yang paling dekat dengan koordinat.:rtype: dict atau Tidak Ada"""instance = font.get_variable_instance_closest_to_coordinates(koordinat={"wght": 1000, "slnt": 815, "wdth": 775})
get_version
"""Mendapatkan versi font.:returns: Nilai versi font.:rtype: float"""version = font.get_version()
get_vertical_metrics
"""Mendapatkan metrik vertikal font.:returns: Kamus berisi metrik vertikal berikut: "units_per_em", "y_max", "y_min", "ascent", "descent", "line_gap", "typo_ascender", "typo_descender ", "typo_line_gap", "cap_height", "x_height", "win_ascent", "win_descent":rtype: dict"""metrics = font.get_vertical_metrics()
get_weight
"""Mendapatkan nilai dan nama bobot font.:returns: Nama dan nilai bobot.:rtype: dict atau Tidak Ada"""weight = font.get_weight()
get_width
"""Mendapatkan nilai dan nama lebar font.:returns: Nama dan nilai lebar.:rtype: dict atau Tidak Ada"""width = font.get_width()
is_color
"""Menentukan apakah font adalah font berwarna.:returns: True jika font berwarna, False sebaliknya.:rtype: bool"""color = font.is_color()
is_monospace
"""Menentukan apakah font adalah font monospace.:param ambang batas: Ambang batas (0,0 <= n <= 1,0) mesin terbang dengan lebar yang sama untuk menganggap font sebagai monospace.:type ambang batas: float:returns: True if font monospace, Salah jika tidak.:rtype: bool"""mono = font.is_monospace(threshold=0.85)
is_static
"""Menentukan apakah font adalah font statis.:returns: True jika font statis, False sebaliknya.:rtype: bool"""static = font.is_static()
is_variable
"""Menentukan apakah font adalah font variabel.:returns: True jika font variabel, False sebaliknya.:rtype: bool"""variable = font.is_variable()
rename
"""Mengganti nama catatan nama font (1, 2, 4, 6, 16, 17) sesuai dengan nama_keluarga dan nama_gaya yang diberikan (nama_keluarga). Jika nama_keluarga tidak ditentukan maka akan terdeteksi secara otomatis. Jika nama_gaya tidak ditentukan maka akan terdeteksi secara otomatis. terdeteksi secara otomatis.:param family_name: Nama keluarga:type family_name: str:param style_name: Nama style:type style_name: str:param update_style_flags: jika Benar, flag gaya akan diperbarui berdasarkan nama subfamili: ketik update_style_flags: bool:raises ValueError: jika nama PostScript yang dihitung lebih panjang dari 63 karakter."""font.rename(family_name="Font Saya Baru", style_name ="Huruf Miring Tebal", update_style_flags=Benar)
sanitize
"""Sanitasi file font menggunakan OpenType Sanitizer.https://github.com/googlefonts/ots-python:param strict: Jika Benar (default), memunculkan pengecualian bahkan pada peringatan pembersih. Jika Salah, hanya memunculkan pengecualian pada kegagalan pembersih (kode keluar bukan nol).:type strict: bool:raises Pengecualian: Jika OpenType Sanitizer melaporkan kesalahan selama proses sanitasi.:return: Tidak ada:catatan: Menggunakan OpenType Sanitizer (ots) untuk membersihkan file font. Menyimpan font ke direktori sementara dan memanggil pembersih pada file yang disimpan. Jika `strict` adalah True (default), perlakukan peringatan sanitizer sebagai kesalahan , hanya memeriksa kesalahan pembersih."""font.sanitize(strict=True)
save
"""Menyimpan font di jalur file.:param filepath: Jalur file, jika Tidak ada jalur file sumber akan digunakan: ketik jalur file: str atau Tidak Ada: param timpa: Timpa, jika Benar file font sumber dapat ditimpa: ketik timpa : bool:returns: Jalur file tempat font disimpan.:rtype: str:raises ValueError: Jika jalur file sama dengan font sumber dan penimpaan tidak diperbolehkan."""saved_font_path = font.save(filepath=Tidak ada, overwrite=False)
save_as_woff
"""Menyimpan font sebagai woff.:param filepath: Jalur file:tipe filepath: str:param overwrite: Timpa, jika Benar file font sumber dapat ditimpa:type overwrite: bool:returns: Jalur file tempat font berada disimpan ke.:rtype: str"""saved_font_path = font.save_as_woff(filepath=Tidak ada, overwrite=True)
save_as_woff2
"""Menyimpan font sebagai woff2.:param filepath: Jalur file:tipe filepath: str:param overwrite: Timpa, jika Benar, file font sumber dapat ditimpa:type overwrite: bool:returns: Jalur file tempat font berada disimpan ke.:rtype: str"""saved_font_path = font.save_as_woff2(filepath=Tidak ada, overwrite=True)
save_to_fileobject
"""Menulis font ke objek seperti file. Jika tidak ada objek file yang diteruskan, instance `BytesIO` dibuat untuk pengguna.:param fileobject: Objek seperti file untuk ditulis.:returns: File objek yang awalnya lolos, atau BytesIOinstance.:rtype baru: mengetik.io.IO"""fileobject = font.save_to_fileobject(fileobject=None)
save_variable_instances
"""Simpan semua instance font variabel ke direktori tertentu dalam satu atau lebih format.:param dirpath: Dirpath:type dirpath: Jalur direktori tempat instance akan disimpan.:param woff2: Apakah akan menyimpan instance juga dalam format WOFF2. Defaultnya adalah True.:type woff2: bool:param woff: Apakah akan menyimpan instance juga dalam format WOFF. Defaultnya adalah True.:type woff: bool:param overwrite: Apakah akan menimpa file yang ada di direktori. Defaultnya adalah True.:type overwrite: bool:param options: Opsi tambahan untuk diteruskan ke instancer ketika membuat instance statis.:type options: kamus:returns: Daftar yang berisi kamus untuk setiap instance yang disimpan. Setiap kamus menyertakan 'instance' (berisi metadata instance) dan 'files' (kamus dengan format file sebagai kunci dan jalur file sebagai nilai).:raises TypeError: Jika font bukan variabel font."""saved_fonts = font.save_variable_instances(dirpath, woff2=True, woff=True, overwrite=True, **pilihan)
set_family_classification
"""Menetapkan klasifikasi keluarga font (sFamilyClass di tabel OS/2) berdasarkan class_id dan subclass_id yang disediakan.:param class_id: Pengidentifikasi numerik dari kelas keluarga font.:param subclass_id: Pengidentifikasi numerik opsional dari subkelas keluarga font (defaultnya adalah 0).:raises OperationError: Jika tabel OS/2 tidak tersedia di font.:raises ArgumentError: Jika class_id tidak valid atau subclass_id ditentukan tetapi tidak valid."""font.set_family_classification(**font.FAMILY_CLASSIFICATION_SCRIPTS_CALLIGRAPHIC)# alternatifnya:font.set_family_classification(class_id=10, subclass_id=5)
set_family_name
"""Menetapkan nama keluarga yang memperbarui catatan nama font terkait.:nama param: Nama:jenis nama: Nama keluarga baru."""font.set_family_name(name="Font Saya Baru")
set_name
"""Menetapkan nama berdasarkan pengidentifikasinya di tabel nama font.:kunci param: ID atau kunci nama (mis. "nama_keluarga"):tipe kunci: int atau str:nilai param: Nilai:nilai tipe: str" ""font.set_name(Font.NAME_FAMILY_NAME, "Nama Keluarga Berganti Nama")
set_names
"""Menetapkan nama berdasarkan pengenalnya di tabel nama.:param nama: Nama:ketik nama: dict"""font.set_names(names={Font.NAME_FAMILY_NAME: "Nama Keluarga Berganti Nama",Font.NAME_SUBFAMILY_NAME: " Berganti Nama Biasa", })
set_style_flag
"""Menetapkan gaya flag.:param key: Flag key:type key: str:param value: Nilai:type value: bool"""font.set_style_flag(Font.STYLE_FLAG_BOLD, True)
set_style_flags
""" Menyetel bendera gaya, bendera yang disetel ke Tidak Ada akan diabaikan.:param tebal: Nilai bendera tebal.:tipe tebal: bool atau Tidak Ada:param miring: Nilai bendera miring.:tipe miring: bool atau Tidak Ada:param garis bawah: Nilai bendera garis bawah.:type garis bawah: bool atau Tidak ada:param outline: Nilai bendera garis besar.:type outline: bool atau Tidak ada"""font.set_style_flags(regular=Tidak ada, tebal=Tidak ada, miring=Tidak ada, outline=Tidak ada, garis bawah=Tidak ada)
set_style_flags_by_subfamily_name
"""Menetapkan bendera gaya berdasarkan nilai nama subfamili. Nilai subfamili harus "reguler", "miring", "tebal", atau "miring tebal" agar metode ini berfungsi dengan baik."""font.set_style_flags_by_subfamily_name()
set_style_name
"""Menetapkan nama gaya yang memperbarui catatan nama font terkait.:nama param: Nama:nama tipe: Nama gaya baru."""font.set_style_name(name="Bold Italic")
set_vertical_metrics
"""Menetapkan metrik vertikal.:param metrics: Argumen kata kunci yang mewakili metrik vertikal yang dapat disetel: "units_per_em", "y_max", "y_min", "ascent", "descent", "line_gap", "typo_ascender" , "typo_descender", "typo_line_gap", "cap_height", "x_height", "win_ascent", "win_descent""""font.set_vertical_metrics(unit_per_em=2000, y_max=2102, y_min=-533, pendakian=1800, keturunan=-400, line_gap=0, typo_ascender=1800, typo_descender=-400, typo_line_gap=0, cap_height =1400, x_height=1080, win_ascent=2160, win_descent=540)
subset
"""Menggabungkan font menggunakan opsi yang diberikan (unicode atau mesin terbang atau teks), dimungkinkan juga untuk meneruskan opsi subsetter, info lebih lanjut di sini: https://github.com/fonttools/fonttools/blob/main/Lib/fontTools /subset/__init__.py:param unicodes: Unicodes:type unicodes: str atau list:param glyphs: Mesin terbang:type mesin terbang: daftar:param teks: Teks:ketik teks: str:param opsi: Opsi subsetter:pilihan tipe: dict"""font.subset(unicodes="", glyphs=[], text="", ** pilihan)
to_sliced_variable
"""Mengonversi font variabel menjadi sebagian dengan memotong sumbu variabel pada koordinat tertentu. Jika nilai sumbu tidak ditentukan, sumbu tidak akan disentuh. Jika nilai min dan maks sumbu sama, sumbu akan disematkan .:param koordinat: Kamus koordinat, setiap nilai item harus berupa tuple/list/dict (dengan kunci 'min', 'default' dan 'max') untuk mengiris atau float/int untuk menyematkan, misalnya. {'wdth':100, 'wght':(100,600), 'ital':(30,65,70)} atau {'wdth':100, 'wght':[100.600], 'ital':[30, 65,70]} atau {'wdth':100, 'wght':{'min':100,'max':600}, 'ital':{'min':30,'default':65,'max':70}}:tipe koordinat: dict:param options : Opsi untuk opsi fontTools.varLib.instancer:type: kamus:raises TypeError: Jika font bukan variabel font:raises ValueError: Jika koordinat tidak ditentukan (kosong):menaikkan ValueError: Jika sumbu koordinat semuanya disematkan"""font.to_sliced_variable(koordinat, **pilihan)
to_static
"""Mengonversi font variabel menjadi font statis dengan menyematkan sumbu variabel pada koordinat tertentu. Jika nilai sumbu tidak ditentukan, sumbu akan disematkan pada nilai defaultnya. Jika koordinat tidak ditentukan, setiap sumbu akan disematkan pada defaultnya nilai.:koordinat param: Koordinat, misal. {'wght':500, 'ital':50}:tipe koordinat: dict atau Tidak Ada:param style_name: Nama gaya instance yang ada, misal 'Black':type style_name: str atau None:param update_names: jika True, catatan nama akan diperbarui berdasarkan instance terdekat:type update_names: bool:param update_style_flags: jika True, flag gaya akan diperbarui berdasarkan instance terdekat: ketik update_style_flags: bool:param options: Opsi untuk fontTools.varLib.instancer:type options: kamus:raises TypeError: Jika font bukan variabel font:meningkatkan ValueError: Jika sumbu koordinat tidak semuanya disematkan"""font.to_static(coordinates=None, style_name=None, update_names=True, update_style_flags=True, **options)
# clone repositorigit clone https://github.com/fabiocaccamo/python-fontbro.git && cd python-fontbro# buat virtualenv dan aktifkan itpython -m venv venv && . venv/bin/activate# upgrade pippython -m pip install --upgrade pip# install persyaratanpython -m pip install -r persyaratan.txt -r persyaratan-test.txt# install pra-komit untuk menjalankan pemformat dan linterpre-commit install -- install-hooks# jalankan pengujian menggunakan toxtox# atau jalankan pengujian menggunakan unittestpython -m unittest
Dirilis di bawah Lisensi MIT.
Terima kasih khusus kepada Jérémie Hornus dan Just Van Rossum.
Bintangi proyek ini di GitHub
Ikuti saya di GitHub
? Ikuti saya di Twitter
? Sponsori saya di Github
python-benedict
- subkelas dict dengan dukungan keylist/keypath, pintasan I/O (base64, csv, json, acar, plist, string kueri, toml, xml, yaml) dan banyak utilitas.
python-fsutil
- utilitas sistem file untuk pengembang yang malas. ?♂️