首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使dict键中存在属性,getattr也会返回默认值

即使dict键中存在属性,getattr也会返回默认值
EN

Stack Overflow用户
提问于 2018-01-14 01:06:20
回答 1查看 1.7K关注 0票数 3

我有一个包含一些json的文件,我加载并循环访问"servers“项,并将它们传递给send_alert()方法(标记为"REDACTED”的项并不是真正的代码/输出):

代码语言:javascript
复制
"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项被跳过,因为它应该为‘login-name’呈现False或None…所以我真的只是在处理yahoo的项目:

代码语言:javascript
复制
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时,我收到以下输出:

代码语言:javascript
复制
{
  "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和Python 3的输出是相同的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-14 01:20:52

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

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

您可以改用dict.get方法

代码语言:javascript
复制
server.get('login-name', None)
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48242217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档