Ошибка, которую вы показываете, не означает, что проблема связана с переменной областью, скорее она встречается на основании того, что вычисления не могут быть выполнены для не похожих типов.
Трудно сказать, не видя вашего полного кода, но, возможно, следующее предложит возможное альтернативное решение:
#!/usr/bin/env python
import datetime
def start():
start_time = datetime.datetime.now()
return start_time
def stop():
stop_time = datetime.datetime.now()
return stop_time
def delta(start,stop):
delta_time = stop - start
print(delta_time)
start=start()
stop=stop()
delta(start,stop)
Это решение перемещает две сгенерированные временные метки (start_time
и stop_time
) в одна единственная функция (delta
) в качестве аргументов, так что когда вычисляется delta_time
, она выполняется для переменных подобного типа в рамках своей функции.
Python разработан для поддержки больше, чем просто объектно-ориентированное программирование. Сохранение того же интерфейса между методами и функциями позволяет двум стилям взаимодействовать более чисто.
Ruby был создан с нуля, чтобы быть объектно-ориентированным. Даже литералы являются объектами (оцените 1.class, и Вы получаете Fixnum). Язык был создан таким образом, что сам зарезервированное слово, которое возвращает текущий экземпляр где бы вы ни были.
Если Вы в методе экземпляра одного из Вашего класса, сам ссылка на упомянутый экземпляр.
Если Вы находитесь в определении самого класса (не в методе), сам сам класс:
class C
puts "I am a #{self}"
def instance_method
puts 'instance_method'
end
def self.class_method
puts 'class_method'
end
end
Во время определения класса, 'Я - C', будет распечатан.
Прямое 'определение' определяет метод экземпляра, тогда как 'определение self.xxx' определяет метод класса.
c=C.new
c.instance_method
#=> instance_method
C.class_method
#=> class_method
Несмотря на требование webmat, Guido записал, что явный сам "не взлом реализации - это - семантическое устройство".
Причиной явного сам в подписях определения метода является семантическая непротиворечивость. Если Вы пишете
класс C: нечто определения (сам, x, y):...
Это действительно совпадает с записью
класс C: передача
нечто определения (сам, x, y):... C.foo = нечто
Это было намеренным проектным решением, не результатом представления поведения OO в последнюю дату.
Все в Python-is-объект, включая литералы.
См. также, Почему 'сам' должен использоваться явно в определениях метода и вызовах?
сам используется только в качестве конвенции, можно использовать спам, бекон или колбасу вместо сам и получить тот же результат. Это - просто первый аргумент, переданный связанным методам. Но придерживайтесь использования сам, поскольку оно смутит других и некоторых редакторов.
Ну, я не знаю много о Ruby. Но очевидный факт о Python "сам" - то, что это не "ключевое слово"... это - просто название аргумента, который это отправляется в Ваш метод.
Можно использовать любое имя, которое Вы любите за этот аргумент. "Сам" просто конвенция.
Например:
class X :
def __init__(a,val) :
a.x = val
def p(b) :
print b.x
x = X(6)
x.p()
Печатает номер 6 на терминале. В конструкторе сам объект на самом деле называют a. Но в p () метод, это назвало b.
Обновление: В октябре 2008 Guido указал, что наличие явного сам было также необходимо, чтобы позволить декораторам Python быть достаточно общими для работы над чистыми функциями, методами или classmethods: http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html