2013-04-22 2 views
2

В файле a.py, у меня есть следующие строки:Является ли обезьяна Python локализована для текущего модуля?

 

import gevent 
gevent.monkey.patch_all() 

import b 
# etc, etc 
 

В файле b.py является необходимым обезьяны патч снова? Есть ли что-то неправильное с патчем обезьяны несколько раз?

+2

Я не эксперт по «gevent», но я не вижу никакого способа, чтобы он не был «глобальным» ... например. Я не вижу никакого способа, чтобы вызовы в 'b' не вели себя как обезглавленные исправленные версии в' a'. Что касается проблем с патчем обезьяны несколько раз, это, вероятно, безопасно, но я думаю, это будет зависеть от реализации. – mgilson

ответ

0

Обычно для каждого модуля имеется только одна запись в sys.modules. т.е. тот же объект модуля является долями, поэтому он влияет на модуль, пока он импортирован таким же образом.

Возможно, иметь тот же модуль в sys.modules под двумя или более записями, если он импортирован по-разному.

+0

Не думаю, что я тебя полностью понимаю. Например, 'socket' - это обезьяна, пропатченная gevent. Итак, если 'a.py' имеет' import socket' и 'b.py' имеет' from socket import * ', эффект будет другим? 'b.py' не будет пропатчить обезьяну? – donatello

+0

@donatello Это зависит от того, когда * исправление завершено и когда импорт будет выполнен. Если исправление завершено * до * импорта, тогда все импортные товары затронуты, но если импорт произошел до исправления, тогда 'a.py' * может * иметь исправленный модуль, а' b' будет по-прежнему использовать исходные функции и т. Д. (из-за импорта звезды). Я не знаю, как 'gevent' делает исправление, поэтому' a' может использовать или не использовать исправленную версию в зависимости от того, заменяет ли gevent объект модуля или изменяет его атрибуты. – Bakuriu

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

  • Нет связанных вопросов^_^