time.localtime () - как это работает? Краткие вопросы о том, как использовать это тоже - супер легкий материал! - PullRequest
1 голос
/ 08 февраля 2010

Как работает time.localtime ()? Я могу вызвать «массив» (tuple, я думаю, он называется - потому что он неизменный?) И его компоненты ссылки / индекса. Например:

>>> time.localtime()[0]
2010

Но если я сделаю:

print time.localtime()
time.struct_time(tm_year=2010, tm_mon=2, tm_mday=7, tm_hour=14, tm_min=46, tm_sec=58, tm_wday=6, tm_yday=38, tm_isdst=0)

Во-первых: как time.localtime () узнает, как вернуть time.struct_time ()?

Во-вторых: если я печатаю print time.struct_time (), он хочет, чтобы ему были переданы дополнительные значения (таким образом, не давая мне те же значения, которые были возвращены из time.localtime ()) - как мне узнать, что эти значения могли бы возможно быть? Я проверил документацию по питону, и я не мог сделать ни «головы, ни хвосты» из этого. На самом деле просто ищу пример здесь ...

В-третьих: когда я индексирую tupple / массив для time.localtime (), он возвращает правильное ассоциированное значение, например, «2010», а не «tm_year = 2010» - как он это узнает (вообще говоря, нет) здесь много чего просят).

Далее: если бы я хотел «вызвать» tm_year из time.localtime (), как я могу это сделать? То, что я делаю (и не чувствую себя правильно), следующее:

tm_year = str(time.localtime()[0])
tm_mon = str(time.localtime()[1])
tm_mday = str(time.localtime()[2])
tm_hour = str(time.localtime()[3])
tm_min = str(time.localtime()[4])

ПРИМЕЧАНИЕ: я сохраняю их в виде строк по другим причинам, не объясненным в этом вопросе, просто хочу указать, что я создаю свои собственные переменные (названные точно так же, как они указаны в наборе), а затем просто ссылаюсь на индекс значение, связанное со значением, которое я хочу

Есть ли способ просто вызвать time.localtime (tm_year) (я знаю, что это работает не так, как есть, а просто мозговой штурм ...)

Заранее спасибо ... (и я прочитал "http://docs.python.org/library/time.html", но я уверен, что пропустил некоторую важную информацию ... какой-нибудь совет?)

-J

Ответы [ 4 ]

3 голосов
/ 08 февраля 2010

time.localtime()[0] вызывает __gettiem__() в экземпляре time.struct_time. Вот как он получает этот список / кортеж как поведение. Вот действительно простой пример

>>> class MyTime(object):
...     def __init__(self, year, month, mday, hour, minute):
...         self.data =  year, month, mday, hour, minute
...     def __getitem__(self, idx):
...         return self.data[idx]
...     def __str__(self):
...         return "MyTime(tm_year=%s, tm_mon=%s, tm_mday=%s, tm_hour=%s, tm_min=%s)"%self.data
... 
>>> x=MyTime(2010,2,7,14,46)
>>> x[0]
2010
>>> x[1]
2
>>> print x
MyTime(tm_year=2010, tm_mon=2, tm_mday=7, tm_hour=14, tm_min=46)

time.struct_time это класс. time.localtime() возвращает экземпляр класса, который объясняет разницу при попытке их распечатать

Вы можете загрузить свои 5 переменных следующим образом

>>> tm_year,tm_mon,tm_mday,tm_hour,tm_min=map(str,time.localtime()[:5])
1 голос
/ 08 февраля 2010

Вы можете создавать свои собственные "именованные кортежи", то есть подклассы tuple с элементами, доступными по индексу или по атрибутам, с collection.namedtuple (в Python 2.6 или выше). Нет ничего «волшебного» ни в именованных кортежах вообще, ни в частности в том, чьи экземпляры возвращаются различными функциями в модуле time (что немного отличается, поскольку оно предшествует collections.namedtuple).

Так, например, time.localtime().tm_year даст вам год по вашему желанию (вы можете передать его на str и / или назначить его на что угодно, конечно).

Но поскольку вы также можете получить доступ к результату в виде кортежа, у вас есть альтернативы, такие как нарезка, распаковка кортежа и т. П.

Когда вы вызываете time.struct_time, вы создаете его произвольный экземпляр - и вам нужно передать ему один аргумент, последовательность из ровно девяти элементов. (Для обычного именованного кортежа, похожего на него, вместо этого вы должны передать девять аргументов - конечно, легко передать девять аргументов, если у вас есть последовательность из девяти последовательностей foo, то есть вы вызываете bar(*foo) ;-).

Кстати, вы сосредотачиваетесь на localtime, но это не единственная функция, возвращающая struct_time, конечно - gmtime и strptime возвращают экземпляры одного типа! -)

0 голосов
/ 08 февраля 2010

Nascent Notes,

Функция time.localtime() принимает необязательный аргумент, равный секундам эпохи , без аргумента она принимает текущее время (возможно, от time.time()). Затем функция вычисляет, какому времени это соответствует в вашем часовом поясе (то есть, по вашему местному времени), и затем возвращает результаты в объекте типа time.struct_time.

Я не уверен, почему вы хотите создать struct_time объект, поскольку вы спрашиваете, какими должны быть аргументы, возможно, вы движетесь в неправильном направлении.

Кажется, что вы заинтересованы в манипулировании представлениями времени. Я думаю, что datetime модуль может быть более подходящим для ваших целей.

0 голосов
/ 08 февраля 2010
  1. Оператор print пытается преобразовать все свои аргументы в строковое представление. И метод __repr__ или __str__ объекта struct_time дает результат

    Время

    См. Документы Python

  2. Не используйте его. Это внутренняя структура данных

  3. Когда вы используете оператор индекса [], он ведет себя как кортеж
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...