python - 即使字典键中存在属性,getattr 也会返回默认值

标签 python python-3.x python-2.7

我有一个包含一些 json 的文件,我加载并循环遍历“服务器”项目并将它们传递给 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"
  }]

我希望 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:)或 try-excepting 值。我在其他情况下成功地做到了这一点。然而,这让我感到难过。 getattr() 返回默认值 None,即使有效的 key 项似乎存在。怎么了?

我尝试了一些建议的“问题可能已经有了你的答案 “而且没有人给我任何帮助。这个看起来很有希望,但要么从未得到回答,要么答案(由提问者提供)不适用于我的情况:Python 3 AttributeError even though attribute exists(即,我之前尝试深度复制单个字典项服务器将其传递给 send_alert)

Python 2 和 3 的输出相同。

最佳答案

getattr获取对象的属性,而不是与映射中的键关联的值。

getattr(server, 'login-name', None) 正在尝试访问属性 server.login-name,而不是值 server['登录名']

您可以改为使用 dict.get方法

server.get('login-name', None)

关于python - 即使字典键中存在属性,getattr 也会返回默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48242217/

相关文章:

python - 如何强制 Python JSON 输出从多头中排除 'L'

python - 如何消除数独方 block 中的凸性缺陷?

python - 类型错误 : 'Interval' object is not iterable

用于使用请求模块登录网站的 Python 3 脚本

python - 如何使用 tkinter 返回 Base 64 编码图形的高度和宽度

python - 如何从 Python 中的 csv 文件生成 JSON?

python - 我可以在运行时从脚本打开应用程序吗?

python - 如何使用 Python 将变量的值赋给 Excel 单元格

python - 在约束分配中使用决策变量 - PuLP

python - 设置正则表达式模式,如果该模式在字符串中得到验证,则其中的一部分将被另一个子字符串替换