3 python python-2.7 python-3.x
我有一个包含一些json的文件,我加载并循环"servers"项并将它们传递给一个send_alert()方法(标记为"REDACTED"的项目不是真正的代码/输出):
"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"
}]
Run Code Online (Sandbox Code Playgroud)
我希望跳过gmail项,因为它应该为'login-name'呈现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")
Run Code Online (Sandbox Code Playgroud)
当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"
}
Run Code Online (Sandbox Code Playgroud)
我想使用getattr,而不是testing(if "login-name" in server:)或try-exceptpting值.我在其他案例中成功完成了这项工作.然而,这让我很难过. getattr()即使有效的关键项似乎存在,也会返回默认值None.怎么了?
我尝试了一些建议的"可能已经有你答案的问题",没有人给我任何帮助.这个似乎很有希望,但要么从未回答,要么答案(由提问者提供)不适用于我的情况:Python 3 AttributeError即使属性存在 (即,我尝试深入复制单个字典项服务器,然后再将其传递给send_alert)
Python 2和3的输出相同.
getattr 获取对象的属性,而不是与映射中的键关联的值.
getattr(server, 'login-name', None)正在尝试访问属性server.login-name,而不是值server['login-name']
您可以改为使用该dict.get方法
server.get('login-name', None)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1607 次 |
| 最近记录: |