@zhihu.log_attr
@zhihu.iter_factory('voters')
def voters(x)->People:
'''获取答案的点赞列表'''
from .People import People
return People(x)
这样报错:NameError: name 'People' is not defined
from .People import People
@zhihu.log_attr
@zhihu.iter_factory('voters')
def voters(x)->People:
'''获取{name}的点赞列表'''
from .People import People
return People(x)
这样报错:ImportError: cannot import name 'People' from 'ZhihuVAPI.content.People'
我只是想要 IDE 能只能提示而已啊,怎么这么难
1
Cheez OP 挽尊
|
2
wrq 2018-08-16 11:55:59 +08:00 via iPhone
IDE 推荐 Pycharm,你的第二个错误是模块名和类名冲突了。
|
4
xiexingjia 2018-08-16 12:20:45 +08:00
两次 from .People import People 是想怎样
|
5
Cheez OP @xiexingjia #4 没别的办法,只能试一试。。。
|
6
NoDocCat 2018-08-16 15:24:42 +08:00 via Android
可以试一下文档注释,看看 IDE 认不认识。
|
8
panyanyany 2018-08-16 15:31:09 +08:00
|
9
Cheez OP @panyanyany #8 试过了......It don;t works
|
10
virusdefender 2018-08-16 15:49:13 +08:00
我试了下 pycharm 有没有 decorator 都是可以正常提示的,你试一下 docstring 吧
""" :return: People """ |
11
virusdefender 2018-08-16 15:50:47 +08:00
另外你的代码没太懂,voters 是实例方法么,为啥没有 self 或者 staticmethod
|
12
zjb861107 2018-08-16 15:51:19 +08:00
。。。我怎么感觉,这两个异常,是非常基础的语法问题?
|
15
Cheez OP @virusdefender #11 我把 voters 绑定到了一个数据源,这里的 voters 实际上只是处理数据的函数。
|
17
Cheez OP @virusdefender #10 docstring 也没有用(暴风哭泣
|
20
zhengxiaowai 2018-08-16 15:57:08 +08:00
pycharm 可以使用 typehits 获得
|
22
Trim21 2018-08-16 16:03:35 +08:00 via Android
感觉这不是你 type hint 写的有问题,是没能成功 import People
pycharm 的话,如果你写的是某个类的方法,想要返回方法所在的类,就像 8 楼一样加引号。如果是其他的函数的话直接像你原来那么写就可以,前提是你成功的把 People 给引入了。 |
24
Trim21 2018-08-16 16:10:01 +08:00 via Android
class Zhihu(:
....class People: ....pass 这个类是这样的? |
26
Cheez OP |
27
Trim21 2018-08-16 16:18:44 +08:00 via Android
@Cheez
if False: from .people import People https://stackoverflow.com/questions/39740632/python-type-hinting-without-cyclic-imports |
28
Cheez OP @Trim21 #27 我放弃了.....Sublime 太智能了,只能在这个 if 里面智能提示,出了 if 又啥都不认得了
|
30
phithon 2018-08-16 18:39:12 +08:00
|
31
forrestchang 2018-08-16 18:51:44 +08:00
lz 先列一下 Python 的版本吧,看提示,应该是 import 的问题。
@panyanyany 加引号是用在 using before definition 情况下的,但是在 3.7 中不需要了,只需: from __future__ import annotations |
32
Cheez OP @phithon #30
@Trim21 #27 @zhengxiaowai #20 我想错了... https://pic1.zhimg.com/80/v2-918dc1f05d88c1212d3388fe347639d6_hd.png 其实是可以返回的,只不过我返回的是一个迭代器,而我却标注为 People 对象,所以识别不了。 那么问题来了,我试了一下 ``` from typing import Iterator ... ... def voters(x)->Iterator[People]: ``` 可是没有反应... 在 Google 搜了一圈,好像没有对复杂类型的迭代器该如何定义这个问题的相关... |
33
Cheez OP @forrestchang #31 我终于发现问题了(暴风哭泣
是因为我不知道怎么返回一个返回自定义对象的迭代器........问题是我现在还是不知道..... |
37
lynskylate 2018-08-16 19:28:40 +08:00 via Android
docstring 这个有很多种格式,大部分都能解析,比如一种格式是:rtype:类型,3.5 以上学学 type hint
|
38
forrestchang 2018-08-16 23:25:02 +08:00
@Cheez #33 你返回的是生成 People 对象的迭代器还是生成器?内置的迭代器类型有 List,不能用吗?还是 People 这个对象本身实现了迭代器协议?
如果是使用 mypy 的话,建议参考: - https://mypy.readthedocs.io/en/latest/protocols.html:这个写了如何自定义协议,要使用 typing_extension 这个包 - https://www.python.org/dev/peps/pep-0484/#the-type-of-class-objects:这个是和 class 相关如何做 type hints,要使用 Type[C] 我看你的描述,获取点赞的列表,应该用 def x() -> List[People] 这样就可以了。 |
39
Cheez OP @forrestchang #38
我是这么做的 ``` @zhihu.log_attr #一个装饰器,根据 doc-string 输出日志 @zhihu.iter_factory('voters') #一个装饰器,最终返回一个生成器 def voters(x): #对数据的处理 '''获取答案的点赞列表''' from .People import People return People(x) def iter_factory(url_function_name, method=json): """返回一个用 deal 遍历 obj 的生成器 Arguments: action_name {[string]} -- [动作的名字] deal_function {[function]} -- [处理遍历到的数据的函数] method {[type]} -- [处理 URL 的函数] (default: {json}) method_arg {[type]} -- [剩下要传给 method 的参数] Returns: [iter] -- [生成器] """ def decorate(deal_function): # 一个装饰器 import functools def wrap(prop): prop.__doc__ = deal_function.__doc__ return prop def iter_function(count=-1, start=1, page=-1)->Iterable[People()]: ``` 老实说,我完全不知道该怎么加了 |