Python 新手语法问题,为什么用 str split 后新建 dict 爆黄呢?

2022-11-16 11:36:24 +08:00
 fenglala
str_x = 'int_value=233/str_value=hello'
dict_x = dict(element.split('=') for element in str_x.split('/'))
print(dict_x)
print(int(dict_x['int_value']))
print(dict_x['str_value'])

这段代码可以正常运行,但是为什么放到 pycharm 里爆黄呢,请问怎么改才能不爆黄呢?

dict()里边爆黄:

Unexpected type(s): (Generator[List[str], Any, None]) Possible type(s): (SupportsKeysAndGetItem[List[str], _VT]) (Iterable[Tuple[Any, Any]]) 
3339 次点击
所在节点    Python
18 条回复
aladdinding
2022-11-16 11:53:16 +08:00
dict_x = dict(tuple(element.split('=')) for element in str_x.split('/'))
fenglala
2022-11-16 11:58:37 +08:00
@aladdinding 还是爆黄,爆黄信息变了

Unexpected type(s): (Generator[Tuple[str, ...], Any, None]) Possible type(s): (SupportsKeysAndGetItem[Tuple[str, ...], _VT]) (Iterable[Tuple[Any, Any]])
westoy
2022-11-16 11:59:11 +08:00
dict(element.split('=', 1) for element in str_x.split('/'))


不过不建议直接搞, 去看看 pyparsing 之类的
aloxaf
2022-11-16 12:01:20 +08:00
element.split('=') 可能产生有长度超过 2 的 list ,理论上加上 maxsplit=1 就能满足要求,可惜 pycharm 还没有这么高级

你只能选择这样干,嫌太长可以用海象运算符简化
dict_x = dict((element.split('=')[0], element.split('=')[1]) for element in str_x.split('/'))

当然我更建议
# noinspection PyTypeChecker
dict_x = dict(element.split('=') for element in str_x.split('/'))
fenglala
2022-11-16 12:01:21 +08:00
@westoy 也爆黄,提示信息变成:
Unexpected type(s): (Generator[List[str], Any, None]) Possible type(s): (SupportsKeysAndGetItem[List[str], _VT]) (Iterable[Tuple[Any, Any]])
fenglala
2022-11-16 12:02:44 +08:00
@aloxaf 感谢!原来只要让 linter 认为这里确定有两个元素就可以了!
fenglala
2022-11-16 12:04:40 +08:00
@aloxaf 按照你的思路,这样写也不爆黄了,不用 split 两遍
dict_x = dict((element.split('=')[0:2]) for element in str_x.split('/'))
hellojay
2022-11-16 12:04:53 +08:00
dict_x = {element.split('=')[0]: element.split('=')[1] for element in str_x.split('/')}
fenglala
2022-11-16 12:05:47 +08:00
啊不行,我大意了,是我前边有 noinspection PyTypeChecker 导致的,我 7 楼的回复还是爆黄
fenglala
2022-11-16 12:08:30 +08:00
dict_x = dict((kv[0], kv[1]) for kv in (element.split('=') for element in str_x.split('/')))
这个可以了!不用多一次 split !
hellojay
2022-11-16 12:16:06 +08:00
@fenglala #10

这个让代码没有任何可读性,你少了一个 split 却多了一个 for

dict_x = {element.split('=')[0]: element.split('=')[1] for element in str_x.split('/')}

这个也不爆黄
xuboying
2022-11-16 13:13:43 +08:00
能不能说文雅一点的告警或者出错。

爆黄,在一众标题里显得很黄很暴力。。。
hsfzxjy
2022-11-16 13:47:24 +08:00
不要太在意这个,告警是静态检查器蠢,不是你写的有问题
luckyx
2022-11-16 13:58:01 +08:00
text = 'int_value=233/str_value=hello'

print({k: v for k,v in [e.split('=') for e in text.split('/')]})

Leetcode playground 能过 🤔
yernsun
2022-11-16 16:05:08 +08:00
import urllib.parse
dict(urllib.parse.parse_qsl('int_value=233/str_value=hello', separator='/'))
zhanglintc
2022-11-17 00:16:10 +08:00
@xuboying #12 其实应该是“报黄”,哈哈。
llsquaer
2022-11-17 09:26:37 +08:00
怎么就那么喜欢一行写代码...

{key:value for key,value in map(lambda item:item.split('='),str_x.split('/'))}
u823tg
2022-11-17 11:53:26 +08:00
是 pycharm 的问题吧, 建议别用-_-。

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

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

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

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

© 2021 V2EX