2015-07-29 2 views
3

это, может быть очень наивный вопрос и, возможно, лучше всего спросил пример:динамическое добавление функции к существующему импортирован модуль

module1.py

import module2 

def new_func(): 
    print(var_string) 
module2.new_func = new_func 

module2.func() 
module2.new_func() 

module2.py

var_string = "i'm the global string!" 

def func(): 
    print(var_string) 

> python module1.py 
i'm the global string! 
Traceback (most recent call last): 
    File "module1.py", line 8, in <module> 
    module2.new_func() 
    File "module1.py", line 4, in new_func 
    print(var_string) 
NameError: name 'var_string' is not defined 

Так что мой вопрос заключается в следующем: Можно ли вставить функцию в модуль и иметь это глобальное обновление имен соответственно?

Связанный: global variable defined in main script can't be accessed by a function defined in a different module Обратите внимание, что я знаю, что совместное использование глобальных переменных является плохой идеей, и я также знаю, что модуль конфигурации будет хороший компромисс в том, что, но обратите внимание, что это не то, что я пытаюсь достигать.

+0

Их не нужно делать это Когда-либо. Вы можете просто использовать операторы if, чтобы определить, какой метод вызывать, или какие аргументы передаются в метод. и т. д. – FirebladeDan

+0

Я не согласен. Я думаю, это было бы очень полезно. Аналогия динамически добавляет метод к существующему классу, который использует другие атрибуты и методы класса. Я также хочу, чтобы эта вставленная функция вызывалась другими модулями. По сути, я динамически расширяю модуль без физического редактирования исходного кода модуля. –

+0

Вам нужно изменить печать (var_string) для печати (module2.var_string) –

ответ

0

Вы можете подумать, что это полезно, но очень маленький питон-код написан таким образом, и я думаю, что большинство программистов на питоне будут путать с кодом, который это делает. Модификация модуля после его импорта (monkeypatching) обычно смотрится сверху вниз, потому что очень легко сделать неправильную вещь и вызвать странные ошибки.

Вы сделали аналогию, сравнивая ее с методами переопределения/расширения класса, но если это действительно то, что вы хотите сделать, почему бы просто не использовать класс? Особенности классов делают его намного безопаснее и проще в этом.

Ваш код будет работать, если вы сделаете это:

from module2 import var_string 
#or.. 
from module2 import * 

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

+0

Справедливая точка. В некотором контексте: я использую модуль протоколирования, и я хотел добавить функцию в модуль (который использует другой материал в модуле), который затем я могу ссылаться на другие модули в своем приложении. Вот оригинальный вопрос, который побудил меня спросить об этом. http://stackoverflow.com/questions/31701470/python-logging-close-and-application-exit –

0

Я не понимаю, что вы хотите, и что эта строка должна делать «module2.new_func = new_func», потому что у вас нет функции new_funcin module2. Но если вы хотите переустановку переменной в каждом из модулей, вы не можете использовать так:

Module1:

import module2 

def new_func(): 
    print(var_string) 

new_class=module2.MyStuff() 
var_string=new_class.func() 
new_func() 

module2:

class MyStuff: 

    def __init__(self): 
     self.var_string = "i'm the global string!" 

    def func(self): 
     print(self.var_string) 
     return self.var_string 
Смежные вопросы