2016-06-23 2 views
0

Я новичок в Python и использую метод time_passed() для отслеживания того, сколько времени прошло.Python: попытка избежать использования глобальной переменной для функции time_passed

Я бы предпочел не использовать глобальную переменную. Есть ли способ написать этот метод, чтобы он не принимал никаких параметров и не использовал глобальную переменную?

import time 

start_time=time.time()  
def time_passed(): 
    return time.time() - start_time 

Что такое pythonic способ справиться с этим?

+1

Что вы подразумеваете под словом «timestamp»? если это настоящая метка времени, зачем вам нужно «ссылку»/«начало»? Говоря, что вам нужно, у вас не будет выбора, а не будет определять начальное время измерения ... – Aviad

+0

Хорошая точка. Это действительно нужно называть time_passed. Я обновлю вопрос, чтобы избежать путаницы. –

+0

глобальные переменные не являются злыми. Если вы абсолютно хотите избежать глобального использования здесь, вы можете использовать функцию генератора, которая инкапсулирует состояние –

ответ

2

Статический эквивалент переменной в Python похож на Javascript, где назначение переменной в определенном пространстве имен объектов дает ей постоянство за пределами области действия, которой она была назначена. Так же, как и в Javascript, функции Python являются объектами и могут быть назначены переменные-члены ,

Так для этого примера вы можете написать

import time 

def timestamp(): 
    timestamp.start_time=time.time() 
    return time.time() - timestamp.start_time 

Edit: теперь, глядя на код, однако, вы явно хотите инициализировать один раз, и эта функция переинициализирует start_time на вызов. Я не такой опытный в Python, но это может работать

import time 

def timestamp(): 
    if timestamp.start_time is None: 
     timestamp.start_time=time.time() 
    return time.time() - timestamp.start_time 
+0

Прохладный. Я подумал, что есть хороший способ сделать это. :-) –

+0

Не стоит беспокоиться о Дан. Я только что изменил start_time на timestamp.start_time. Таким образом, он работал нормально. :-) Единственное уловка заключается в том, что функция должна быть определена до назначения. –

+0

BTW, None не работает, когда я тестирую его на python 2.7. Что работает с использованием hasttr. Итак, для другого варианта использования я использовал: if not hasattr (timestamp, «start_time»): и это работает. :-) –

1

Вы можете написать простой класс хранения время начала:

import time 

class Timer: 
    def __init__(self): 
     self.start = time.time() 

    def __call__(self): 
     return time.time() - self.start 

затем использовать это нравится:

time_passed = Timer() 
print time_passed() 

Таким образом, вы можете легко использовать несколько таймеров.

+0

Спасибо. Я буду помнить об этом. Я думаю, что это не нужно для time_passed, но он отлично подойдет для некоторых других ситуаций. :-) –

1

Генератор должен использоваться для функций, которые необходимо инкапсулировать в состояние.

import time 


def time_passed_generator(): 
    start_time = time.time() 
    while True: 
     yield time.time() - start_time 

time_passed = time_passed_generator() 

#start 

next(time_passed) # should be about 0.0 

# ... later get the time passed 

print(next(time_passed)) 
Смежные вопросы