Гольф з імпортом Python


16

Коли вигідно використовувати вбудований одноразовий імпорт у Python?

Наприклад:

__import__("x").doSomething()

Чи вищезазначене коли-небудь коротше, ніж нижче?

import x
x.doSomething()

Або

from x import*
doSomething()

Відповіді:


11

Це може бути корисно, якщо ви хочете один раз використовувати модуль у функції анонімної лямбда, оскільки це дозволяє уникнути написання окремої заяви:

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

на один байт коротше, ніж

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

Якщо код є іменованою функцією або програмою, __import__навряд чи це допоможе, за винятком самих крайніх або надуманих обставин.


__import__допоможе всередині іменованої функції, оскільки вона буде знаходитись всередині відрізного блоку. Імпорт коштуватиме додатково, оскільки він складається з двох рядків і з відступом. (Це припустимо, що імпорт заборонений поза функцією.)
Алекс А.

@AlexA Я не бачу проблем із розміщенням імпорту за межами названої функції.
feersum

Тоді коли-небудь буде час, коли importйого називатимуть всередині відступного блоку? Напевно, ні.
Олексій А.

розміщення імпорту за межами названої функції не спрацює із завданнями, коли ви пишете лише одну функцію.
Спарр

6
Другий приклад не вимагає, f=оскільки анонімні функції дозволені і можуть містити вміст поза функцією .
xnor

4

При імпорті декількох модулів з досить довгими іменами може бути корисно призначити __import__ функцію коротшій змінній та використовувати її для імпорту

Приклад:

Звіт про регулярне імпортування - 97 байт

з імпорту itertools *
з імпорту дати *
список друку (перестановки ("abc"))
друкувати datetime.now ()

Призначення __import__до i- 94 байт:

i = __ import__
список друку (i ("itertools"). перестановки ("abc"))
print i ("datetime"). datetime.now ()

1

Майже ніколи.

__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.


1
Ви можете перевірити свою математику? Я вважаю, що вона __import__("x").doSomething()на один шар коротша, ніж from x import*;doSomething(). Може бути, ви рахуєте новий рядок як два знаки? І я пригадую, що точка беззбитковості була 5, що потрапляє між timeі random.
xnor

@xnor Я не рахував нові рядки двічі, але я пропустив, що вам не потрібна крапка в цій версії. Дайте мені хвилинку, я оновлю.
L3viathan

1
z=__import__("x").y- байт коротший ніжfrom x import y as z
від’ємний сім

1
@negativeseven Коротше: from x import*;z=y.
L3viathan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.