【发布时间】:2018-01-14 01:20:51
【问题描述】:
我有一个包含一些 json 的文件,我加载并循环通过“服务器”项目并将它们传递给 send_alert() 方法(标记为“已编辑”的项目不是真正的代码/输出):
"servers": [
{
"address": "smtp.gmail.com",
"encrypted-password": "Copy and Paste from 'password' after encryption.",
"login-name": false,
"port": 587,
"type": "email"
},
{
"address": "smtp.mail.yahoo.com",
"encrypted-password": "<REDACTED>",
"login-name": "<REDACTED>@yahoo.com",
"port": 587,
"type": "email"
}]
我希望 gmail 项目被跳过,因为它应该为“登录名”呈现 False 或 None...所以我真的只是在处理 yahoo 项目:
def send_alert(self, server, message, email):
print(json.dumps(server, encoding=self.encoding,
sort_keys=True, indent=2))
print(type(server))
print(server["login-name"])
username = getattr(server, "login-name", None)
enc_pass = getattr(server, "encrypted-password", None)
address = getattr(server, "password", None)
port = getattr(server, "port", None)
server_type = getattr(server, "type", None)
mess = message
if not username:
print(username)
self.log.warn("incorrectly configured alert!\n:%s",
json.dumps(server, encoding=self.encoding,
sort_keys=True, indent=2))
return False
if server_type.lower() == "email":
self.send_email(username, enc_pass, address, port, mess, email)
else:
self.log.debug("unknown server type listed in Alerts/servers")
当send_alert 被调用时,我收到以下输出:
{
"address": "smtp.mail.yahoo.com",
"encrypted-password": <REDACTED>,
"login-name": "<REDACTED>@yahoo.com",
"port": 587,
"type": "email"
}
<type 'dict'>
<REDACTED>@yahoo.com
None
[11:35:39] [Wrapper.py/WARNING]: incorrectly configured alert!
:{
"address": "smtp.mail.yahoo.com",
"encrypted-password": <REDACTED>,
"login-name": "<REDACTED>@yahoo.com",
"port": 587,
"type": "email"
}
我想使用 getattr,而不是测试 (if "login-name" in server:) 或尝试排除值。我在其他情况下也成功地做到了这一点。然而,这让我很难过。 getattr() 返回默认值 None,即使似乎存在有效的键项。怎么了?
我尝试了一些建议的“可能已经有你答案的问题” " 并且没有人给我任何帮助。这个似乎很有希望,但要么从未得到回答,要么答案(由提问者提供)不适用于我的案例:Python 3 AttributeError even though attribute exists(即,我之前尝试过深度复制单个字典项服务器将其传递给 send_alert)
Python 2 和 3 的输出相同。
【问题讨论】:
-
为什么?,Json.dumps 部分工作得很好..
-
项目服务器已经是一个字典。 json.dumps 读数仅用于调试或错误消息...
-
getattr获取对象的属性,而不是容器中的元素。您要求的不是server['login-name'],而是server.login-name,它不存在。 -
谢谢帕特里克!
-
已经是字典了,栈。阅读 Patrick Haugh 的真实答案
标签: python python-3.x python-2.7