Получение значений с правильным типом в Redis

Я использую redis в своем приложении python для хранения простых значений, таких как счетчики и списки штампов времени, но пытаясь получить счетчик и сравнивая его с номером, я столкнулся с проблемой.

Если я сделаю:

import redis ... myserver = redis.Redis("localhost") myserver.set('counter', 5) 

и затем попытайтесь получить это значение следующим образом:

 if myserver.get('counter') < 10: myserver.incr('counter') 

то я получаю ошибку типа в выражении if, потому что я сравниваю «5» <10, что означает, что я храню целочисленное значение и получаю строку (которая может рассматриваться как другое значение).

Мой вопрос: должно ли это работать так? Я имею в виду его очень простой тип, я понимаю, если мне нужно разбирать объекты, но int? Кажется, я делаю что-то неправильно.

Есть ли какая-то конфигурация, которую мне не хватает?

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

Может ли это быть проблемой с клиентом redis-py, который я использую, а не перерисовать сам?

    С технической точки зрения, вам нужно позаботиться об этом самостоятельно.

    Однако посмотрите на эту ссылку , особенно на части их README, которая ссылается на парсеры и ответные обратные вызовы, возможно, это то, что вы можете использовать. Вопрос в том, будет ли это излишним для вас или нет.

    Как сказал @favoretti, ответные обратные вызовы будут делать трюк. Это не сложно, просто одна строка, и все будет позаботиться.

     In [2]: import redis In [3]: r = redis.Redis() In [10]: r.set_response_callback('HGET', float) In [11]: r.hget('myhash', 'field0') Out[11]: 4.6 

    для hmget он возвращает список строк, а не одну строку, поэтому вам нужно построить немного более полную функцию обратного вызова:

     In [12]: r.set_response_callback('HMGET', lambda l: [float(i) for i in l]) In [13]: r.hmget('myhash', 'field0') Out[13]: [4.6] 

    то же самое для hgetall .

    Похоже, именно так redis сохраняет свои данные:

     redis 127.0.0.1:6379> set counter 5 OK redis 127.0.0.1:6379> type counter string redis 127.0.0.1:6379> incr counter (integer) 6 redis 127.0.0.1:6379> type counter string 

    Если вы действительно этого захотите, возможно, вы можете обезопасить клиента redis-py чтобы вывести данные.

    Вот мой тест. Два redis-соединения: один возвращает тип int, другой float

     import redis age_field = redis.Redis() age_field.set_response_callback('HGET', int) age_field.hget('foo', 'age') # OUT: 40 a =age_field.hget('foo', 'age') type(a) # OUT: <type 'int'> gpa_field = redis.Redis() gpa_field.set_response_callback('HGET', float) gpa_field.hget('foo', 'gpa') # OUT: 2.5 b = gpa_field.hget('foo', 'gpa') type(b) # OUT: <type 'float'>