Golf dengan Impor Python

16

Kapan bermanfaat menggunakan inline, sekali pakai mengimpor dalam Python?

Sebagai contoh:

__import__("x").doSomething()

Apakah yang di atas pernah lebih pendek dari yang di bawah ini?

import x
x.doSomething()

Atau

from x import*
doSomething()
Peluruhan Beta
sumber

Jawaban:

11

Ini dapat berguna jika Anda ingin menggunakan modul hanya sekali dalam fungsi lambda anonim, karena memungkinkan Anda untuk menghindari menulis pernyataan terpisah:

lambda x:__import__('SomeModule').foo(x,123)

lebih pendek satu byte dari

from SomeModule import*;f=lambda x:foo(x,123)

Jika kode adalah fungsi atau program bernama, maka __import__tidak mungkin untuk membantu kecuali dalam keadaan yang paling ekstrim atau dibuat-buat.

feersum
sumber
__import__akan membantu di dalam fungsi bernama karena itu akan berada di dalam blok berlekuk. Impor akan dikenakan biaya tambahan karena ada dua baris dan menjorok ke dalam. (Itu dengan asumsi bahwa impor tidak diperbolehkan di luar fungsi.)
Alex A.
@AlexA Saya tidak melihat masalah dengan menempatkan impor di luar fungsi bernama.
feersum
Lalu akankah ada saat ketika importakan disebut bagian dalam blok berlekuk? Mungkin tidak.
Alex A.
menempatkan impor di luar fungsi yang disebutkan tidak akan berhasil untuk tantangan di mana Anda hanya menulis satu fungsi.
Sparr
6
Contoh kedua tidak memerlukan f=karena fungsi anonim diizinkan dan dapat memiliki konten di luar fungsi .
xnor
4

Saat mengimpor beberapa modul dengan nama yang cukup panjang, akan sangat membantu untuk menetapkan __import__fungsi ke variabel yang lebih pendek dan menggunakannya untuk impor

Contoh:

Pernyataan impor reguler - 97 byte

dari impor itertools *
dari impor datetime *
daftar cetak (permutasi ("abc"))
cetak datetime.now ()

Menetapkan __import__ke i- 94 byte:

i = __ import__
daftar cetak (i ​​("itertools"). permutasi ("abc"))
cetak i ("datetime"). datetime.now ()
negatif tujuh
sumber
1

Hampir tidak pernah.

__import__("x").doSomething()membutuhkan 15+ x karakter untuk merujuk ke modul dengan nama panjang x .

import x\nx.doSomething()membutuhkan 9 + 2 * x karakter. Fungsi-fungsi ini tumpang tindih pada x = 6, jadi dibandingkan dengan cara ini, setiap modul dengan nama yang lebih panjang lebih baik digunakan __import__, apa pun manfaat yang lebih pendek dari impor normal:

Namun, from x import*\ndoSomething()hanya membutuhkan 14+ x karakter, jadi dibandingkan dengan impor normal, itu tidak sepadan kecuali nama modul lebih panjang dari 5 karakter:

Ini semua mengasumsikan bahwa Anda merujuk ke fungsi / kelas / apa pun hanya sekali. Jika Anda merujuknya lebih dari sekali, rumus berubah, dan versi yang terakhir mungkin menjadi pemenang. Jika Anda menggunakan sesuatu yang panjang dari modul yang diimpor beberapa kali, versi lain akan menang:

from x import y as zmemberi Anda 18+ x + y + z * ( n +1) karakter untuk n penggunaan z , yang merupakan peningkatan besar jika y besar, karena z dapat dibuat 1.

L3viathan
sumber
1
Bisakah Anda memeriksa matematika Anda? Saya menemukan __import__("x").doSomething()menjadi satu char lebih pendek dari from x import*;doSomething(). Mungkin Anda menghitung baris baru sebagai dua karakter? Dan saya ingat titik impas menjadi 5, jatuh di antara timedan random.
xnor
@ xnor Saya tidak menghitung baris baru dua kali, tetapi saya melewatkan bahwa Anda tidak memerlukan titik di versi itu. Beri saya waktu sebentar, saya akan memperbarui.
L3viathan
1
z=__import__("x").yadalah byte yang lebih pendek darifrom x import y as z
negatif tujuh
1
@negativeseven Shorter: from x import*;z=y.
L3viathan