Python 中 message.guild.id if message.guild else None 这种表达式,还能写得更简洁吗?

9 天前
 drymonfidelia

另外

new_message = {
        'messageId': message.id,
        'authorId': message.author.id,
        'content': message.content,
        'guildId': message.guild.id if message.guild else None
}

如果我想让 authorId 在 message.author 为 None 时直接没有这项,有办法在定义这个 dict 就实现,而不是创建完再 del 或者创建完再加上吗?

1088 次点击
所在节点    Python
22 条回复
Hopetree
9 天前
这样的吧
if message.author:
new_message['guildId'] = message.author
hefish
9 天前
这个,多写几句不费墨水吧。
drymonfidelia
9 天前
@Hopetree 这样更不简洁了
jfcherng
9 天前
是可以, 但不利於靜態分析
getattr(message.guild, 'id', None)
Dece
9 天前
pydantic 可以看下这个,BaseModel 类有个方法 [.dict] , 支持传参数 exclude_none=True, 可以将类转为 dict ,并且忽略掉 None 值
renmu
9 天前
改用 defaultdict ,应该也许可以
cdwyd
9 天前
message.get('guild',{}).get('id', None)
CrossMythic
9 天前
**({'authorId': message.author.id} if message.author else {})
应该是可以,不过没啥意义
customsshen
9 天前
message.guild.get("id")
drymonfidelia
9 天前
@customsshen AttributeError: 'NoneType' object has no attribute 'get'
qq135449773
9 天前
deplives
9 天前
[None, message.guild.id][message.guild]
lolizeppelin
9 天前
别搞语法了,到时候搞得和 c#一样 getter setter 五种以上写法
XueXianqi
9 天前
@deplives 你这个方法不行,列表的第二个元素拿不到会直接报错(因为此时没有判断 message.guild 就直接去取 message.guild 的 id 属性)
XueXianqi
9 天前
直接用反射即可:"guildId": getattr(message.guild, "id", None)
sampeng
9 天前
所以说 xxx 是 python/js 的生产力。


1. 在 Python 中,如果你想简化表达式 message.guild.id if message.guild else None ,可以使用内置的 getattr() 函数,这种方式可以更加简洁且直观。

使用 getattr() 函数,你可以直接指定想要获取的属性,如果该属性不存在,则返回你指定的默认值。这里是如何用 getattr() 来重写你的表达式:

getattr(message.guild, 'id', None)

这行代码尝试从 message.guild 获取 id 属性,如果 message.guild 是 None 或者 message.guild 没有 id 属性,它会返回 None 。这种方式可以使代码更加简洁且易于理解。

2.可以在定义字典时使用条件表达式( ternary operator ),这样就可以在初始化时直接决定是否包含某个键。这里是一个针对你需求的示例代码:
new_message = {
'messageId': message.id,
'content': message.content,
'guildId': message.guild.id if message.guild else None,
**({'authorId': message.author.id} if message.author else {})
}
在这个示例中,我使用了字典解包(**)来根据条件动态地添加 authorId 键。如果 message.author 是 None ,那么这部分字典将不会被添加到 new_message 中。这样一来,new_message 就只会在 message.author 不为 None 时包含 authorId 。这种方法避免了创建后修改字典的需求,使得代码更加简洁和高效。
lisxour
8 天前
@sampeng 在大多语言里就是 ?? 操作符的事( python 后面也加上去了),你给我看 300 字小文章?
Sawyerhou
8 天前
楼上朋友们的解法非常聪明。

不过真的比直接写好吗?会不会不太美观?
还是说只是作为理论探讨,不应该于实际生产?
marcong95
8 天前
@lisxour PEP 505 – None-aware operators 已经 deferred 了,你用的什么未来版本 Python ?
abersheeran
8 天前
@marcong95 #19
@lisxour #17

他大概用的是 https://mingshe.aber.sh/syntax/nullish-coalescing/ 😜怎么不算 Python 呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1051063

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX