function isObject(o) {
return null != o &&
typeof o === 'object' &&
Object.prototype.toString.call(o) === '[object Object]';
}
function isDerivedObject(o) {
return !isObject(o) &&
null != o &&
(typeof o === 'object' || typeof o === 'function') &&
/^\[object /.test(Object.prototype.toString.call(o));
}
// Loose equality operator (==) is intentionally used to check
// for undefined too
// Also note that, even null is an object, within isDerivedObject
// function we skip that and always return false for null
В Javascript, null
, Object
, Array
, Date
и function
- все объекты. Хотя null
немного надумано. Итак, лучше сначала проверить null
, чтобы обнаружить, что оно не равно нулю.
Проверка на typeof o === 'object'
гарантирует, что o
является объектом. Без этой проверки Object.prototype.toString
был бы бессмысленным, поскольку он возвращал бы объект навсегда, даже для undefined
и null
! Например: toString(undefined)
возвращает [object Undefined]
!
После проверки typeof o === 'object'
toString.call (o) является отличным методом для проверки того, является ли o
объектом, производным объектом, подобным Array
, Date
или function
.
В функции isDerivedObject
проверяется, является ли o
функцией. Потому что функционируют также как объект, поэтому он здесь. Если этого не произошло, функция вернется как false. Пример: isDerivedObject(function() {})
вернет false
, однако теперь возвращает true
.
Всегда можно изменить определение того, что является объектом. Таким образом, можно изменить эти функции соответственно.
function isObject(o) {
return null != o &&
typeof o === 'object' &&
Object.prototype.toString.call(o) === '[object Object]';
}
function isDerivedObject(o) {
return !isObject(o) &&
null != o &&
(typeof o === 'object' || typeof o === 'function') &&
/^\[object /.test(Object.prototype.toString.call(o));
}
// TESTS
// is null an object?
console.log(
'is null an object?', isObject(null)
);
console.log(
'is null a derived object?', isDerivedObject(null)
);
// is 1234 an object?
console.log(
'is 1234 an object?', isObject(1234)
);
console.log(
'is 1234 a derived object?', isDerivedObject(1234)
);
// is new Number(1234) an object?
console.log(
'is new Number(1234) an object?', isObject(new Number(1234))
);
console.log(
'is new Number(1234) a derived object?', isDerivedObject(1234)
);
// is function object an object?
console.log(
'is (new (function (){})) an object?',
isObject((new (function (){})))
);
console.log(
'is (new (function (){})) a derived object?',
isObject((new (function (){})))
);
// is {} an object?
console.log(
'is {} an object?', isObject({})
);
console.log(
'is {} a derived object?', isDerivedObject({})
);
// is Array an object?
console.log(
'is Array an object?',
isObject([])
)
console.log(
'is Array a derived object?',
isDerivedObject([])
)
// is Date an object?
console.log(
'is Date an object?', isObject(new Date())
);
console.log(
'is Date a derived object?', isDerivedObject(new Date())
);
// is function an object?
console.log(
'is function an object?', isObject(function(){})
);
console.log(
'is function a derived object?', isDerivedObject(function(){})
);
Здесь проще всего выполнить форк. Я почти уверен, что это не работает в Windows, к сожалению, поскольку я думаю, что их модель процесса может отличаться от unix-подобных операционных систем. Однако процесс будет аналогичным.
pid = os.fork()
if pid:
# we are the parent, continue on
print "This runs in a separate process from the else clause."
else:
#child runs browser then quits.
webbrowser.open_new(url)
print "Exiting..."
sys.exit()
Похоже, это зависит от того, на какой платформе вы работаете.
Я предполагаю, что вы работаете в Windows, которая, как упомянул другой комментатор, не имеет вилки. Я также предполагаю, что модуль webbrowser внутренне использует fork, поэтому он не работает для вас в Windows. Если это так, то использование модуля потоковой передачи для создания нового потока, который открывает веб-браузер, может быть самым простым решением:
>>> import webbrowser
>>> import threading
>>> x=lambda: webbrowser.open_new('http://scompt.com')
>>> t=threading.Thread(target=x)
>>> t.start()
Модуль веб-браузера выполняет системный вызов для запуска отдельной программы (веб-обозревателя), затем ожидает («блокирует») кода выхода. Это происходит каждый раз, когда вы запускаете программу из другой программы. Вы должны (A) написать свою собственную функцию, которая не блокирует ожидание выхода веб-браузера (с помощью потоков, fork () и т.п.), или выяснять, имеет ли модуль веб-браузера неблокирующий вызов.