2013-04-23 3 views
1

Я рассмотрел вопрос similar, но на самом деле он не отвечает на вопрос, который у меня есть. Скажем, у меня есть следующий код (слишком упрощенный, чтобы выделить только мой вопрос).Python: модуль импорта без выполнения сценария

class A: 
    def __init__(self,x): 
     self.val = x 

a = A(4) 
print a.val 

Этот код находится в файле someones_class.py. Теперь я хочу импортировать и использовать класс A в свою программу без измененияsomeones_class.py. Если я сделаю from someones_class import A, python все равно выполнит строки сценария в файле.

Вопрос: Есть ли способ импортировать класс A без выполнения двух последних строк?

Я знаю про if __name__ == '__main__' вещь, но у меня нет возможности изменить файл someones_class.py, так как он получен только после запуска моей программы.

+1

Если модуль, который вы хотите импортировать, имеет в нем строки, которые не являются частью 'if __name__ == '__main __':' suite, тогда он сломан, и вы не должны поощрять автора, пытаясь обойти его , Вместо этого отметьте это как ошибку, которая будет исправлена. – martineau

ответ

5

Этот ответ должен продемонстрировать, что это может быть сделано , но, очевидно, потребуется лучшее решение для обеспечения того, чтобы вы включили класс (ы), который хотите включить.

>>> code = ast.parse(open("someones_class.py").read()) 
>>> code.body.pop(1) 
<_ast.Assign object at 0x108c82450> 
>>> code.body.pop(1) 
<_ast.Print object at 0x108c82590> 
>>> eval(compile(code, '', 'exec')) 
>>> test = A(4) 
>>> test 
<__main__.A instance at 0x108c7df80> 

Вы можете осмотреть code тело для элементов, которые вы хотите включить и удалить все остальное.

ПРИМЕЧАНИЕ: Это гигантский взлом.

+0

+1 для комментария «гигантский взлом». : D –

+0

Спасибо за взлома! Можно ли объяснить код выше? Что делают поп-заявления? и eval? – Nik

1

Нет, нет возможности предотвратить выполнение этих дополнительных строк. Лучшее, что вы можете сделать, это прочитать скрипт и разобрать класс - используя это для создания нужного вам класса.

Скорее всего, это будет работать больше, чем вы хотите, но для сильной воли может понадобиться модуль ast.

+0

Я был немного разочарован, когда 'из класса импорта модуля 'не работал. Я надеялся, что, поскольку я точно задал, что именно я хочу импортировать, интерпретатор Python поймет, что ему не нужно иметь дело с другими вещами в модуле. – Nik

+1

@Nik - Для этого есть веская причина. 'class' мог использовать другие константы, функции, классы, определенные на уровне модуля. Если python также отказался импортировать их, тогда класс, который вы импортировали, может не работать – mgilson

1

Нет, нет способа. По крайней мере, не без крайней хитрости ... то есть в Python все возможно, если вы готовы взломать какое-то странное «решение».

Откуда возникает этот «someones_class.py»? Почему ты не можешь изменить его? Я имею в виду, отредактируйте файл, а не измените его с вашего кода. Можете ли вы рассказать человеку, который написал это, чтобы не писать сортировку - тестовый код на верхнем уровне?

Здесь есть интересный (и очень важный) урок о скрытом здесь Python: «class A:» не является объявлением. Это фактически код, который интерпретатор Python выполняет при загрузке файла.

Смежные вопросы