Augumen Python 3 Pohon Sintaks Abstrak (ASTS) dengan informasi tipe statis.
Python adalah bahasa pemrograman yang diketik secara dinamis. Namun, banyak dari kode Python yang biasanya terlihat akan berfungsi bahkan jika secara statis diketik!
Dengan paket ini, seseorang dapat memasukkan informasi jenis statis ke dalam pohon sintaks abstrak Python (ASTS), jadi dengan asumsi bahwa kode yang diberikan akan berfungsi jika Python diketik secara statis, orang dapat beralasan tentang jenis dalam kode secara statis, sebelum eksekusi.
AST augmented tersebut terutama dimaksudkan untuk analisis/konsumsi menggunakan alat lain.
Bekerja paling baik dengan ASTS dari modul typed_ast , namun juga berfungsi dengan modul ast bawaan.
Dianjurkan bahwa ini adalah pekerjaan yang berkelanjutan, dan implementasi saat ini mengalami perubahan mendadak.
Dukungan typed_ast akan dijatuhkan setelah Python 3.8 dirilis, karena fungsinya akan digabungkan ke dalam parser AST bawaan.
Isi
Anda dapat menggunakan modul static_typing untuk menguraikan kode secara langsung menggunakan fungsi parse() :
import static_typing as st
class MyClass :
pass
module = st . parse ( 'def my_fun(obj: MyClass) -> MyClass: return obj' )
# TODO: currently there is no public API yet
functions = module . _functions
my_fun = module . _functions [ 'my_fun' ]
assert MyClass in my_fun . _params [ 'obj' ] Atau, Anda dapat menambah AST yang ada menggunakan fungsi augment() :
import static_typing as st
import typed_ast . ast3
module = typed_ast . ast3 . parse ( '''def spam(): x, y, z = 'ham', 42, 3.1415 # type: str, int, float''' )
module = st . augment ( module )
# TODO: currently there is no public API yet
function = module . _functions [ 'spam' ]
assert len ( function . _local_vars ) == 3
assert float in function . _local_vars [ 'z' ]Untuk lebih banyak contoh, lihat contoh.ipynb notebook.
Selain fitur utama, perpustakaan berisi modul static_typing.ast_manipulation yang berisi alat tingkat rendah dan blok bangunan yang memungkinkan:
typed_ast ke ast built-in dan sebaliknya) dan Proses atau pengetikan statis, yang diterapkan fungsi augment() , memiliki 3 langkah utama:
Di semua node yang berlaku, jenis petunjuk disimpan di bidang type_comment , annotation dan returns . Jenis Petunjuk Petunjuk Membaca bidang -bidang itu - yang merupakan string atau AST mentah.
Ia menggunakan tabel simbol python yang disediakan untuk menyelesaikan petunjuk jenis menjadi objek tipe aktual menggunakan introspeksi.
Secara default, resolver hanya menggunakan simbol bawaan bila dipanggil langsung atau melalui augment() . Namun, ketika dipanggil melalui parse() menggunakan globals() dan locals() dari penelepon secara default.
Petunjuk tipe yang diselesaikan disimpan langsung di AST. Secara khusus, setiap bidang yang diselesaikan disimpan dalam bidang bernama yang sesuai, yang baik resolved_type_comment , resolved_annotation atau resolved_returns .
Dengan demikian, informasi tipe statis tersedia di AST.
Untuk setiap simpul AST yang mungkin berisi deklarasi nama apa pun, versi yang dijalankan dari suatu simpul disediakan. Setiap simpul AST yang diperluas memiliki bidang baru yang menyimpan nama -nama yang dinyatakan dan mengetik informasi yang terkait dengan setiap nama.
Bidang -bidang baru ini menyimpan semua informasi jenis dari semua petunjuk jenis yang diselesaikan dalam lingkup lokal, sehingga konflik jenis atau kurangnya informasi jenis dapat dideteksi. Juga, berdasarkan informasi gabungan ini, tipe inferensi dapat dilakukan.
Secara khusus, versi baru dari node AST berikut dengan bidang baru disediakan: Module , FunctionDef , ClassDef , Assign , AnnAssign , For dan With . Versi -versi baru itu memiliki nama mereka diawali StaticallyTyped...
Daftar entitas yang informasi dikumpulkan di bidang -bidang baru itu berikut.
Untuk Module :
Untuk FunctionDef :
Untuk ClassDef :
Untuk Assign dan AnnAssign :
For :
Untuk With :
Penulisan ulang AST berarti mengganti node AST biasa yang tercantum di atas dengan versi yang diperluas.
Python versi 3.5 atau lebih baru.
Pustaka python sebagaimana ditentukan dalam persyaratan.txt.
Tes membangun dan menjalankan juga membutuhkan paket yang tercantum dalam test_requirements.txt.
Diuji di Linux dan Windows.