未找到服务 __len__ 意外错误,已安全恢复

Service __len__ not found Unexpected error, recovered safely

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)

你能帮我解决这个问题吗?至少如何更精确地定位它。

这似乎是 PyCharm 调试器在调试期间检查活动对象的方式造成的问题。

具体来说,它会检查给定对象是否在 var_to_xml 的代码中具有 __len__ attribute/method,最有可能为调试器接口确定对象的适当表示形式 (这似乎需要构建一个 XML 表示)。

googleads 服务对象,例如您的 campaign_service,但是,使用一些魔法能够在它们上调用定义的 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 没有名为 __len__ 的 SOAP 操作,引发异常。

您可以通过 运行 您的代码片段以常规方式(即不调试它)验证它并检查它是否有效。

实际的修复似乎需要 PyCharm 的调试器改变它检查对象的方式(不调用 hasattr(v, "__len__"))或者 googleads 修改它实现 __getattr__,例如通过实际实现一个只引发 AttributeError.

__len__ 方法