Служба __len__ не найдена Неожиданная ошибка, безопасно восстановленная - PullRequest
0 голосов
/ 10 февраля 2020

python3 .8

Мой код:

from googleads import adwords

def execute_request():
    adwords_client = adwords.AdWordsClient.LoadFromStorage(path="google_general/googleads.yaml")
    campaign_service = adwords_client.GetService('CampaignService', version='v201809')
    pass


context["dict_list"] = execute_request()

Отслеживание:

Traceback (most recent call last):
  File "/home/michael/pycharm-community-2019.3.2/plugins/python-ce/helpers/pydev/_pydevd_bundle/pydevd_xml.py", line 282, in frame_vars_to_xml
    xml += var_to_xml(v, str(k), evaluate_full_value=eval_full_val)
  File "/home/michael/pycharm-community-2019.3.2/plugins/python-ce/helpers/pydev/_pydevd_bundle/pydevd_xml.py", line 369, in var_to_xml
    elif hasattr(v, "__len__") and not is_string(v):
  File "/home/michael/PycharmProjects/ads3/venv/lib/python3.8/site-packages/googleads/common.py", line 694, in __getattr__
    raise googleads.errors.GoogleAdsValueError('Service %s not found' % attr)
googleads.errors.GoogleAdsValueError: Service __len__ not found
Unexpected error, recovered safely.

googleads.yaml о ведении журнала

logging:
  version: 1
  disable_existing_loggers: False
  formatters:
    default_fmt:
      format: ext://googleads.util.LOGGER_FORMAT
    handlers:
      default_handler:
        class: logging.StreamHandler
        formatter: default_fmt
        level: DEBUG
    loggers:
    # Configure root logger
      "":
      handlers: [default_handler]
      level: DEBUG

Я только начал изучать API. А именно, я пытаюсь выполнить свой первый запрос (https://developers.google.com/adwords/api/docs/guides/first-api-call#make_your_first_api_call)

Не могли бы вы помочь мне с этой проблемой? Хотя бы как точнее его локализовать.

1 Ответ

1 голос
/ 12 февраля 2020

Похоже, это проблема, возникающая из-за того, что отладчик PyCharm проверяет живые объекты во время отладки.

В частности, он проверяет, имеет ли данный объект атрибут / метод __len__ в коде var_to_xml, скорее всего, для определения подходящего представления объекта для интерфейса отладчика (который, по-видимому, требует построения XML представления).

googleads сервисных объектов, таких как ваш campaign_service, однако, используйте маги c, чтобы иметь возможность вызывать определенные методы SOAP для них, не требуя жесткого их кодирования. Код выглядит следующим образом:

def __getattr__(self, attr):
    """Support service.method() syntax."""
    if self._WsdlHasMethod(attr):
      if attr not in self._method_proxies:
        self._method_proxies[attr] = self._CreateMethod(attr)
      return self._method_proxies[attr]
    else:
      raise googleads.errors.GoogleAdsValueError('Service %s not found' % attr)

Это означает, что проверка отладчиком потенциального атрибута __len__ перехвачена, и потому что CampaignService не имеет операции SOAP, вызываемой __len__, возникает исключение.

Вы можете проверить это, выполнив обычный фрагмент (т.е. не отлаживая его) и проверив, работает ли он.

Может показаться, что исправлено либо требовать, чтобы отладчик PyCharm изменил способ проверки объектов (не вызывая hasattr(v, "__len__")), либо чтобы googleads изменил способ, которым он реализует __getattr__, например, путем фактической реализации метода __len__, который просто вызывает AttributeError.

...