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)
您能帮我解决这个问题吗?至少如何更精确地定位它。
这似乎是由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
。