未找到服务 __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__
方法
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__
方法