Python что означает “AttributeError: объект 'unicode' не имеет никакого атрибута 'has_key'”

Если Вы даете Вашей таблице уникальный идентификатор, его более легкое:

<div id="ctl00_ContentPlaceHolder1_Jobs_dlItems_ctl01_a"
    onmouseup="checkMultipleSelection(this,event);">
       <table id="ctl00_ContentPlaceHolder1_Jobs_dlItems_ctl01_a_table" 
              cellpadding="0" cellspacing="0" border="0" width="100%">
           <tr>
              <td style="width:50px; text-align:left;">09:15 AM</td>
              <td style="width:50px; text-align:left;">Item001</td>
              <td style="width:50px; text-align:left;">10</td>
              <td style="width:50px; text-align:left;">Address1</td>
              <td style="width:50px; text-align:left;">46545465</td>
              <td style="width:50px; text-align:left;">ref1</td>
           </tr>
       </table>
</div>


var multiselect = 
    document.getElementById(
               'ctl00_ContentPlaceHolder1_Jobs_dlItems_ctl01_a_table'
            ).rows[0].cells,
    timeXaddr = [multiselect[0].innerHTML, multiselect[2].innerHTML];

//=> timeXaddr now an array containing ['09:15 AM', 'Address1'];
5
задан Hoang Pham 5 September 2009 в 22:17
поделиться

5 ответов

В этой строке:

if value is not None and not value.has_key():

значение представляет собой строку в Юникоде. Похоже, код ожидает, что это будет db.Model ,

(Из того, что я вижу, has_key - это метод db.Model ], а также метод словарей Python, но это должен быть метод db.Model , потому что он вызывается без аргументов.)

Передаете ли вы строку в API GAE, который ожидает db.Model ?

6
ответ дан 18 December 2019 в 14:49
поделиться

Ваша проблема в том, что postedcountry - это строка, а не объект страны. Значения, полученные из self.request.get, представляют собой строковые значения переменных, передаваемые браузером.

Вам нужно найти объект страны с помощью некоторого GQL. То, как именно вы это сделаете, будет зависеть от того, что именно возвращает поле страны вашей HTML-формы, ключ объекта ?, название страны?

def post(self):
  postedcountry = self.request.get('country')

  # <-------- Need to look up a country here !!!!!

  cmsRequest = models.CMSRequest(country=postedcountry)
3
ответ дан 18 December 2019 в 14:49
поделиться

Поскольку никто еще не ответил на этот бит:

Кортеж? (или как там это называется?)

Слово «кортеж» происходит от математики. В математике мы можем говорить о (упорядоченных) парах, если мы делаем 2d геометрию. Переход к трём измерениям означает, что нам нужны тройки. В более высоких измерениях нам нужны четверки, пятерки и, ммм, любой префикс для шести и так далее. Это становится проблемой, и математики также любят обобщать («давайте сегодня поработаем с n измерениями!»), Поэтому они начали использовать термин «n-tuple» для упорядоченного списка из n элементов (обычно чисел).

После этого немного естественной лени - все, что вам нужно, чтобы отбросить «n-», и мы получим кортежи.

s лучше тестировать свои контейнеры с помощью оператора Python in (который неявно вызывает __ contains __ () --- и который работает со списками, строками и другими последовательностями, а также с типами сопоставления) .

Также value.has_key () вызовет ошибку, даже если value был словарем, поскольку метод .has_key () требует аргумента.

В вашем коде я бы либо явно проверил для , если значение postcountry не равно None: ..., либо снабдил бы ваш .get () (необязательным) значением по умолчанию для " отправленная страна ".

Как вы хотите справиться с ситуацией, когда запрос не имеет отправленную страну ? Вы хотите это предположить? отправляется из какого-то конкретного значения по умолчанию? Принудительно перенаправить на какую-то страницу, которая требует, чтобы пользователь указал значение для этого элемента формы? Предупредить испанскую инквизицию?

2
ответ дан 18 December 2019 в 14:49
поделиться

Вы пытаетесь установить строку в ReferenceProperty. Поле «страна» в CMSCountry - это db.ReferenceProperty, которое принимает объект db.Key или CMSCountry, но вы пытаетесь установить его в виде строки.

Вы должны сделать что-то вроде этого:

def post(self):
  postedcountry = self.request.get('country')
  country = models.CMSCountry.all().filter('name =', postedcountry)
  if not country:
    # Couldn't find the country
  else:
    cmsRequest = models.CMSRequest(country=country)

Однако, пожалуйста, сообщите об ошибке , связанной с довольно бесполезным сообщением об ошибке.

1
ответ дан 18 December 2019 в 14:49
поделиться

Если вы прочитаете трассировку, она точно скажет вам, что происходит:

    if value is not None and not value.has_key():
AttributeError: 'unicode' object has no attribute 'has_key'

Это означает, что используемая вами переменная value не имеет атрибута has_key . И он говорит вам, что ваша переменная value не является словарем, поскольку похоже, что вы ожидаете ... вместо этого это объект Unicode, который по сути является строкой.

1
ответ дан 18 December 2019 в 14:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: