2013-07-21 3 views
2

Глядя на эту Джанго код из djangobook:Может ли% s быть целым числом? * Python код *

from django.http import Http404, HttpResponse 
import datetime 

def hours_ahead(request, offset): 
    try: 
     offset = int(offset) 
    except ValueError: 
     raise Http404() 
    dt = datetime.datetime.now() + datetime.timedelta(hours=offset) 
    html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt) 
    return HttpResponse(html) 

после попытки, она преобразует смещение в целое число, не так ли? и в строке 'datetime.timedelta (hours = offset)', смещение используется как целое число, но в строке 'html = "В% s час (ей) это будет% s." % (offset, dt) '

смещение - это% s, который является строкой, не так ли? Или мне не хватает понимания? Я думал, что% s может быть только строкой, а не целым числом?

ответ

11

%s называет str() метод на его соответствующий аргумент ... (аналогично %r вызовов repr()) - так что либо из них могут быть использованы для любого объекта ... В отличие от %d (%i то же самое) и %f для который потребует соответствующих типов.

+2

Вы можете найти это явно в [docs] (http://docs.python.org/2/library/stdtypes.html#string-formatting) в таблице конверсий. – wflynny

+0

Отлично, спасибо! – user216485

1

offset Если это целое (в данном случае, это не верно для любого типа объекта), то вы можете использовать любого из %s, %d, %r, и вы получите тот же результат.

%d форматирует целое число для отображения, %s называет str() на аргументе, %r вызовы repr():

>>> n = 5 
>>> str(n) 
'5' 
>>> repr(n) 
'5' 

Также см documentation.

1

В будущем, когда вы любопытны о чем-то, запустите интерпретатор и исследуйте самый простой случай.

>>> a = 1 
>>> a 
1 
>>> 'this is %s string.' % (a) 
'this is 1 string.' 

Затем экстраполируйте вопросы оттуда. Может быть, следующий использовать произвольный объект, так как INT работал, где вы думали, требовался ул:

>>> from threading import Thread 
>>> b = Thread() 
>>> b 
<Thread(Thread-1, initial)> 
>>> 'this is %s string.' % (b) 
'this is <Thread(Thread-1, initial)> string.' 

Это общий поток, как я исследую неожиданные результаты. Если вы доктор, идите на это, но лично я никогда не был для чтения руководства; Я просто не воспринимаю информацию таким образом.

+0

+1 для рекомендации просто попробовать. ''% s '% 1' - это все, что необходимо. – dansalmo