Коли вигідно використовувати вбудований одноразовий імпорт у Python?
Наприклад:
__import__("x").doSomething()
Чи вищезазначене коли-небудь коротше, ніж нижче?
import x
x.doSomething()
Або
from x import*
doSomething()
Коли вигідно використовувати вбудований одноразовий імпорт у Python?
Наприклад:
__import__("x").doSomething()
Чи вищезазначене коли-небудь коротше, ніж нижче?
import x
x.doSomething()
Або
from x import*
doSomething()
Відповіді:
Це може бути корисно, якщо ви хочете один раз використовувати модуль у функції анонімної лямбда, оскільки це дозволяє уникнути написання окремої заяви:
lambda x:__import__('SomeModule').foo(x,123)
на один байт коротше, ніж
from SomeModule import*;f=lambda x:foo(x,123)
Якщо код є іменованою функцією або програмою, __import__
навряд чи це допоможе, за винятком самих крайніх або надуманих обставин.
import
його називатимуть всередині відступного блоку? Напевно, ні.
f=
оскільки анонімні функції дозволені і можуть містити вміст поза функцією .
При імпорті декількох модулів з досить довгими іменами може бути корисно призначити __import__
функцію коротшій змінній та використовувати її для імпорту
Звіт про регулярне імпортування - 97 байт
з імпорту itertools * з імпорту дати * список друку (перестановки ("abc")) друкувати datetime.now ()
Призначення __import__
до i
- 94 байт:
i = __ import__ список друку (i ("itertools"). перестановки ("abc")) print i ("datetime"). datetime.now ()
__import__("x").doSomething()
потрібно 15+ x символів для позначення модуля з назвою довжини x .
import x\nx.doSomething()
потрібно 9 + 2 * х символів. Ці функції перекриваються при x = 6, тому порівняно з цим будь-який модуль з довшою назвою краще використовувати __import__
, чим коротші вигоди від звичайного імпорту:
Однак from x import*\ndoSomething()
потрібно лише 14+ x символів, тому порівняно зі звичайним імпортом не варто, якщо назва модуля не перевищує 5 символів:
Все це передбачає, що ви посилаєтесь на функцію / клас / будь-яку лише один раз. Якщо ви посилаєтесь на нього не раз, формули змінюються, і остання версія може стати переможцем. Якщо ви використовуєте щось імпортоване з імпортного модуля кілька разів, виграє ще одна версія:
from x import y as z
дає вам 18+ x + y + z * ( n +1) символів для n використання z , що є великим поліпшенням, якщо y є великим, тому що z може бути зроблено 1.
__import__("x").doSomething()
на один шар коротша, ніж from x import*;doSomething()
. Може бути, ви рахуєте новий рядок як два знаки? І я пригадую, що точка беззбитковості була 5, що потрапляє між time
і random
.
z=__import__("x").y
- байт коротший ніжfrom x import y as z
from x import*;z=y
.
__import__
допоможе всередині іменованої функції, оскільки вона буде знаходитись всередині відрізного блоку. Імпорт коштуватиме додатково, оскільки він складається з двох рядків і з відступом. (Це припустимо, що імпорт заборонений поза функцією.)