Analitycs

вторник, 31 января 2012 г.

Python/PHP - запятая - казнить нельзя помиловать

Сегодня ловлю баг в сервисе - в JSON-результате вместо поля с integer  выдается список элементов-integer, то есть вместо

data : {
  'id' : 1
}

упорно получаю

data : {
  'id' : [1]
}

Перепроверяю код 20 раз - ничего не могу понять... вроде все правильно, должен быть идентификатор ОДИН, но хоть ты тресни - список. Подвисаю на несколько минут, иду попить кофе, снова смотрю в код...

Через несколько минут доходит - начинаю истерически хохотать

def bla-bla(self, args): 
    data = {
      'bla-bla' : bla_bla,
      'name' : name,
      'id' : temp_id,
    }
  return data


Правлю один символ - все работает. После хохота начинаю вспоминать хорошего PHP team-leader, с которым работал много-много лет назад.

Он был большим аккуратистом в плане чистоты форматирования кода и железнобетонно приучил меня расставлять меня запятые в ассоциативных массивах в КАЖДОМ элементе, включая последний.  Так как в случае необходимости быстро переставить элементы в коде - не пришлось бы искать потенциальную ошибку c пропущенной запятой.

А для Python - это собственно - сокращенный формат списка-последовательности.

Так что вот вам прекрасный пример того, что старые привычки часто вредят, а иногда - вредят ОЧЕНЬ сильно. "Казнить нельзя помиловать" (с)   ;-)

Ну и верный вариант - БЕЗ запятой ;-)

def bla-bla(self, args): 
    data = {
      'bla-bla' : bla_bla,
      'name' : name,
      'id' : temp_id
    }
  return data

5 комментариев:

  1. Что-то, Миш, у тебя в версии питона, видимо, баг.
    Сокращённый вариант последовательности это "(1,)", а не "1,". Заптая в списках работает вполне хорошо и я ни разу не встречал описываемого тобой. Единственная теория, повторюсь, — баг в конкретной версии питона.

    >>> type({'test':2,'id':1,}["id"])

    ОтветитьУдалить
    Ответы
    1. Гриш, на трех машинах проверено, сейчас специально под Lion - не баг, листинг ниже


      $ python
      Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53)
      [GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
      Type "help", "copyright", "credits" or "license" for more information.
      >>> r = 1
      >>> t = r,
      >>> t
      (1,)
      >>>

      Удалить
  2. возвращает int (тегорезка отрезала)

    ОтветитьУдалить
  3. Со словарём не получается повторить. Пробовал на 2.5 и 2.6:

    >>> 1,
    (1,)
    >>> {'test':2,'id':1,}["id"]
    1

    ОтветитьУдалить
    Ответы
    1. Да, в таком варианте не проходит, но с присвоением переменных - как выше - получается...

      "It's a magic" (c) ;-)

      Удалить