Я не понимаю, почему об этом никто не говорит, но для меня самым простым решением является использование imp.find_module («modulename») (документация здесь ):
import imp
imp.find_module("os")
Он дает кортеж с дорожкой во второй позиции:
(,
'/usr/lib/python2.7/os.py',
('.py', 'U', 1))
Преимущество этого метода над «проверкой» заключается в том, что вам не нужно импортировать модуль, чтобы сделать его работа, и вы можете использовать строку ввода. Полезно при проверке модулей, вызываемых, например, в другом скрипте.
EDIT:
В python3 модуль importlib
должен делать:
Doc из importlib.util.find_spec
:
Вернуть спецификацию для указанного модуля.
Во-первых, sys.modules проверяется, был ли модуль уже импортирован. Если да, то возвращается sys.modules [name] .spec. Если для этого параметра установлено значение Нет, то ValueError будет поднят. Если модуль отсутствует в sys.modules, тогда sys.meta_path ищет подходящую спецификацию со значением «path», заданным для искателей. Ничего не возвращается, если никакой spec не найден.
Если имя для подмодуля (содержит точку), родительский модуль автоматически импортируется.
Имя и аргументы пакета работают Аналогично importlib.import_module (). Другими словами, работают относительные имена модулей (с ведущими точками).
blockquote>
Как и Мэтт, у меня было гораздо больше впечатлений, когда я немного увеличил значение тайм-аута. Кроме того, чтобы смягчить проблему двойного срабатывания одиночного щелчка (что мне все равно не удалось воспроизвести с помощью более высокого таймера), я добавил строку в обработчик одиночного щелчка:
el.onclick = function() {
if (timer) clearTimeout(timer);
timer = setTimeout(function() { alert('Single'); }, 250);
}
Таким образом, если щелчок уже настроен на запуск, он очистится, чтобы избежать дублирования "одиночных" предупреждений.
Если вы получаете 2 предупреждения, может показаться, что ваш порог обнаружения двойного щелчка слишком мал. Попробуйте увеличить от 150 до 300 мс.
Также - я не уверен, что вам гарантирован порядок, в котором запускаются click и dblclick. Итак, когда ваш dblclick запускается, он очищает событие first click, но если оно срабатывает до второго события 'click', это второе событие все равно будет запускаться само по себе, и вы закончите как с запуском события двойного щелчка, так и с запуском события одиночного щелчка.
Я вижу два возможных решения этой потенциальной проблемы:
1) Установите другой тайм-аут для фактического запуска события двойного щелчка. Отметьте в своем коде, что событие двойного щелчка вот-вот сработает. Затем, когда срабатывает второе событие "одиночный щелчок", он может проверить это состояние и сказать "ой,
2) Второй вариант - поменять местами целевые функции на основе событий щелчка. Это может выглядеть примерно так:
window.onload = function() {
var timer;
var el = document.getElementById('testButton');
var firing = false;
var singleClick = function(){
alert('Single');
};
var doubleClick = function(){
alert('Double');
};
var firingFunc = singleClick;
el.onclick = function() {
// Detect the 2nd single click event, so we can stop it
if(firing)
return;
firing = true;
timer = setTimeout(function() {
firingFunc();
// Always revert back to singleClick firing function
firingFunc = singleClick;
firing = false;
}, 150);
}
el.ondblclick = function() {
firingFunc = doubleClick;
// Now, when the original timeout of your single click finishes,
// firingFunc will be pointing to your doubleClick handler
}
}
По сути, здесь происходит то, что вы позволяете исходному установленному вами таймауту продолжаться. Он всегда будет вызывать firingFunc (); Единственное, что меняется, - это то, на что фактически указывает firingFunc (). При обнаружении двойного щелчка он устанавливает для него значение doubleClick. И затем мы всегда возвращаемся обратно к singleClick по истечении тайм-аута.
У нас также есть переменная "firing", чтобы мы знали, что нужно перехватывать второе событие одиночного щелчка.
Другой альтернативой является полное игнорирование событий dblclick и просто определите его с помощью одиночных щелчков и таймера:
window.onload = function() {
var timer;
var el = document.getElementById('testButton');
var firing = false;
var singleClick = function(){
alert('Single');
};
var doubleClick = function(){
alert('Double');
};
var firingFunc = singleClick;
el.onclick = function() {
// Detect the 2nd single click event, so we can set it to doubleClick
if(firing){
firingFunc = doubleClick;
return;
}
firing = true;
timer = setTimeout(function() {
firingFunc();
// Always revert back to singleClick firing function
firingFunc = singleClick;
firing = false;
}, 150);
}
}
Это не проверено :)
2) Второй вариант - поменять местами целевые функции на основе событий щелчка. Это может выглядеть примерно так:
window.onload = function() {
var timer;
var el = document.getElementById('testButton');
var firing = false;
var singleClick = function(){
alert('Single');
};
var doubleClick = function(){
alert('Double');
};
var firingFunc = singleClick;
el.onclick = function() {
// Detect the 2nd single click event, so we can stop it
if(firing)
return;
firing = true;
timer = setTimeout(function() {
firingFunc();
// Always revert back to singleClick firing function
firingFunc = singleClick;
firing = false;
}, 150);
}
el.ondblclick = function() {
firingFunc = doubleClick;
// Now, when the original timeout of your single click finishes,
// firingFunc will be pointing to your doubleClick handler
}
}
По сути, здесь происходит то, что вы позволяете исходному установленному вами таймауту продолжаться. Он всегда будет вызывать firingFunc (); Единственное, что меняется, - это то, на что фактически указывает firingFunc (). При обнаружении двойного щелчка он устанавливает для него значение doubleClick. И затем мы всегда возвращаемся обратно к singleClick по истечении тайм-аута.
У нас также есть переменная "firing", чтобы мы знали, что нужно перехватить 2-е событие одиночного щелчка.
Другой альтернативой является полное игнорирование событий dblclick и просто определите это с помощью одиночных щелчков мыши и таймера:
window.onload = function() {
var timer;
var el = document.getElementById('testButton');
var firing = false;
var singleClick = function(){
alert('Single');
};
var doubleClick = function(){
alert('Double');
};
var firingFunc = singleClick;
el.onclick = function() {
// Detect the 2nd single click event, so we can set it to doubleClick
if(firing){
firingFunc = doubleClick;
return;
}
firing = true;
timer = setTimeout(function() {
firingFunc();
// Always revert back to singleClick firing function
firingFunc = singleClick;
firing = false;
}, 150);
}
}
Это не проверено :)
window.onload = function() {
var timer;
var el = document.getElementById('testButton');
var firing = false;
var singleClick = function(){
alert('Single');
};
var doubleClick = function(){
alert('Double');
};
var firingFunc = singleClick;
el.onclick = function() {
// Detect the 2nd single click event, so we can stop it
if(firing)
return;
firing = true;
timer = setTimeout(function() {
firingFunc();
// Always revert back to singleClick firing function
firingFunc = singleClick;
firing = false;
}, 150);
}
el.ondblclick = function() {
firingFunc = doubleClick;
// Now, when the original timeout of your single click finishes,
// firingFunc will be pointing to your doubleClick handler
}
}
По сути, здесь происходит то, что вы позволяете исходному установленному вами тайм-ауту продолжаться. Он всегда будет вызывать firingFunc (); Единственное, что меняется, - это то, на что фактически указывает firingFunc (). При обнаружении двойного щелчка он устанавливает для него значение doubleClick. И затем мы всегда возвращаемся обратно к singleClick по истечении тайм-аута.
У нас также есть переменная "firing", чтобы мы знали, что нужно перехватить 2-е событие одиночного щелчка.
Другой альтернативой является полное игнорирование событий dblclick и просто определите это с помощью одиночных щелчков мыши и таймера:
window.onload = function() {
var timer;
var el = document.getElementById('testButton');
var firing = false;
var singleClick = function(){
alert('Single');
};
var doubleClick = function(){
alert('Double');
};
var firingFunc = singleClick;
el.onclick = function() {
// Detect the 2nd single click event, so we can set it to doubleClick
if(firing){
firingFunc = doubleClick;
return;
}
firing = true;
timer = setTimeout(function() {
firingFunc();
// Always revert back to singleClick firing function
firingFunc = singleClick;
firing = false;
}, 150);
}
}
Это не проверено :)
window.onload = function() {
var timer;
var el = document.getElementById('testButton');
var firing = false;
var singleClick = function(){
alert('Single');
};
var doubleClick = function(){
alert('Double');
};
var firingFunc = singleClick;
el.onclick = function() {
// Detect the 2nd single click event, so we can stop it
if(firing)
return;
firing = true;
timer = setTimeout(function() {
firingFunc();
// Always revert back to singleClick firing function
firingFunc = singleClick;
firing = false;
}, 150);
}
el.ondblclick = function() {
firingFunc = doubleClick;
// Now, when the original timeout of your single click finishes,
// firingFunc will be pointing to your doubleClick handler
}
}
По сути, здесь происходит то, что вы позволяете исходному установленному вами тайм-ауту продолжаться. Он всегда будет вызывать firingFunc (); Единственное, что меняется, - это то, на что фактически указывает firingFunc (). При обнаружении двойного щелчка он устанавливает для него значение doubleClick. И затем мы всегда возвращаемся обратно к singleClick по истечении тайм-аута.
У нас также есть переменная "firing", чтобы мы знали, что нужно перехватить 2-е событие одиночного щелчка.
Другой альтернативой является полное игнорирование событий dblclick и просто определите это с помощью одиночных щелчков мыши и таймера:
window.onload = function() {
var timer;
var el = document.getElementById('testButton');
var firing = false;
var singleClick = function(){
alert('Single');
};
var doubleClick = function(){
alert('Double');
};
var firingFunc = singleClick;
el.onclick = function() {
// Detect the 2nd single click event, so we can set it to doubleClick
if(firing){
firingFunc = doubleClick;
return;
}
firing = true;
timer = setTimeout(function() {
firingFunc();
// Always revert back to singleClick firing function
firingFunc = singleClick;
firing = false;
}, 150);
}
}
Это не проверено :)