V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
z888888cn
V2EX  ›  Python

出现这个错误,大家是如何解决的? Local variable 'xxxx' might be referenced before assignment ,我有强迫症。

  •  
  •   z888888cn · 2019-09-27 16:05:39 +08:00 · 5828 次点击
    这是一个创建于 1663 天前的主题,其中的信息可能已经有所发展或是发生改变。

    出现这个错误,大家是如何解决的? Local variable 'result' might be referenced before assignment,我有强迫症。

    这是一段简单的代码。

    if method == ToolRequest.GET:
        result = self.session.get(url)
    elif method == ToolRequest.POST:
        result = self.session.post(url, data=data)
    print(f"请求 URL {url}\n 返回状态 {result.status_code}\ncookie {result.cookies}\n 返回内容 {result.content}")
    print()
    return result
    

    附上图吧,大家都知道这是 Pycharm 吧

    1

    2

    14 条回复    2019-09-28 10:37:49 +08:00
    lspvic
        1
    lspvic  
       2019-09-27 16:21:52 +08:00 via Android
    在 if 前定义 result=None
    kaid97
        2
    kaid97  
       2019-09-27 16:23:20 +08:00
    第一个是因为可能存在在使用前没有对 result 进行赋值,第二个是你声明 result 为 Response 类型,又先初始化为 None,要么第一个加个 else: result = None,让 result 必定会被初始化,要么就第二个不声明不就行。。
    bantao
        3
    bantao  
       2019-09-27 16:23:32 +08:00 via Android
    elif 后面再加个 else 就可以了
    lspvic
        4
    lspvic  
       2019-09-27 16:25:59 +08:00 via Android
    加个 else raise 吧,result=None 了下面还是有可能报错
    Vegetable
        5
    Vegetable  
       2019-09-27 16:28:03 +08:00
    你别写这种编辑器都能看出来有问题的代码就行了,这 put 请求代码不就报错了吗?
    result:typing.Optional[requests.Response]=None 就行了。
    Vegetable
        6
    Vegetable  
       2019-09-27 16:30:24 +08:00
    @Vegetable 哎我没用 pycharm,可能还不行。因为这样的话 return 的类型又错了,还是
    else:
    return super().request(*args,**kwargs)这样吧。下边就应该就没问题了
    ipwx
        7
    ipwx  
       2019-09-27 16:36:27 +08:00
    首先,我想问的是,你确定这里 method 只有 GET 和 POST 么。。。
    z888888cn
        8
    z888888cn  
    OP
       2019-09-27 16:40:10 +08:00
    @ipwx 这是简单的示例代码。我只是想知道,如何解决 Pycharm 这个警告。
    z888888cn
        9
    z888888cn  
    OP
       2019-09-27 16:45:40 +08:00
    @kaid97 @Vegetable 感谢两位大佬,我成功解决了。

    第一种解决方法:在 `elif` 后面在 在一个 `else: result = None`,让 `result` 必定会被初始化。

    第二种解决方法:

    直接先对`result`初始化`None`

    ```python
    import typing
    result: typing.Optional[requests.Response] = None
    ```
    z888888cn
        10
    z888888cn  
    OP
       2019-09-27 16:46:40 +08:00
    咦,好奇怪。这个论坛回复,无法重新编辑。回复也无法使用 markdown 语法?
    Vegetable
        11
    Vegetable  
       2019-09-27 17:06:26 +08:00
    @z888888cn 小破论坛,吃枣药丸 /狗头
    z888888cn
        12
    z888888cn  
    OP
       2019-09-27 17:19:37 +08:00
    @Vegetable 这个论坛挺好的,https://learnku.com/python/t/34547,
    注册流程 和 提问要发帖的时候特别有意思,要花费 10-20 分钟时间,回答提问的智慧。
    缺点就是人气太差,没 V2EX 好。
    sazima
        13
    sazima  
       2019-09-27 21:34:29 +08:00
    if method == ToolRequest.GET:
    result = self.session.get(url)
    elif method == ToolRequest.POST:
    result = self.session.post(url, data=data)
    else:
    raise MethodNotAllowed()
    locoz
        14
    locoz  
       2019-09-28 10:37:49 +08:00
    强迫症慎用类型注解
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1062 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:10 · PVG 03:10 · LAX 12:10 · JFK 15:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.