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

问题描述 投票:0回答:1

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:

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

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

google-adwords
1个回答
0
投票

这似乎是由PyCharm调试器在调试过程中检查活动对象的方式引起的问题。

[具体来说,它检查给定对象在__len__的代码中是否具有var_to_xml属性/方法,最有可能为调试器接口确定该对象的适当表示形式(似乎需要构造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__的方式,例如通过实际实现__len__的方法。只会提高AttributeError

© www.soinside.com 2019 - 2024. All rights reserved.