Facebook Python «ValueError: слишком много значений для распаковки»

Я новичок в программировании и Python.

Ниже мой код.

import csv import json import urllib import sys import time import re class FacebookSearch: def __init__(self, query = 'https://graph.facebook.com/search.{mode}?{query}&{access_token}' ): access_token = 'XXXXXX|XXXXX' def search(self, q, mode='json', **queryargs): queryargs['q'] = q query = urllib.urlencode(queryargs) return query def write_csv(fname, rows, header=None, append=False, **kwargs): filemode = 'ab' if append else 'wb' with open(fname, filemode) as outf: out_csv = csv.writer(outf, **kwargs) if header: out_csv.writerow(header) out_csv.writerows(rows) def main(): ts = FacebookSearch() response, data = ts.search('appliance', type='post') ## here is where I am getting the error. js = json.loads(data) messages = ([msg['created_time'], msg['id']] for msg in js.get('data', [])) write_csv('fb_washerdryer.csv', messages, append=True) if __name__ == '__main__': main() 

Вот и обратная ошибка:

Traceback (последний последний вызов): Файл «./facebook_washer_ryer1.sh», строка 43, в главном () файле «./facebook_washer_ryer1.sh», строка 33, в главном ответе, data = ts.search («устройство», type = 'post') ValueError: слишком много значений для распаковки

Ваш метод FacebookSearch.search возвращает одно значение, строку запроса для привязки к URL-адресу.

Но когда вы это называете, вы пытаетесь распаковать результаты на две переменные:

 response, data = ts.search('appliance', type='post') 

И это не работает.

Итак, почему ошибка говорит «слишком много значений» вместо «слишком мало»? Ну, строка на самом деле представляет собой последовательность односимвольных строк, поэтому она пытается распаковать эту единственную строку на десятки отдельных значений, по одному для каждого символа.


Однако здесь у вас гораздо большая проблема. Вы явно ожидали, что ваш метод search вернет ответ и некоторые данные, но он не возвращает ничего даже удаленно, как ответ и некоторые данные, он возвращает строку запроса. Я думаю, вы хотели создать URL-адрес с строкой запроса, затем загрузить этот URL-адрес, а затем вернуть результаты этой загрузки.

Если вы не пишете код, который на самом деле пытается это сделать (что, вероятно, означает изменение __init__ для хранения self.query и self.access_token , используя self.query.format в search , используя urllib2.urlopen в полученной строке и кучу других изменений ), остальная часть вашего кода не будет делать ничего полезного.

Если вы хотите «вырезать» FacebookSearch , так что вы можете протестировать остальную часть вашего кода, вам нужно заставить его возвращать соответствующие поддельные данные, с которыми может работать остальная часть вашего кода. Например, вы можете сделать это:

 def search(self, q, mode='json', **queryargs): queryargs['q'] = q query = urllib.urlencode(queryargs) # TODO: do the actual query return 200, '{"Fake": "data"}'