折腾:
期间,对于之前一直可以动态提示和自动完成的变量,比如
from selenium import webdriver
driver = webdriver.Chrome()
driver后输入点,然后就可以显示出动态匹配,自动完成:
对应着,通过find_element_by_xpath等方法获取到的WebElement后,也是可以有动态提示的:
但是刚刚发现,此处:
driver后面和WebElement后面,都没了动态提示了:
即:输入priceSpanElement. 没有了之前的,动态提示,自动完成,没法看出有哪些属性和函数
后来才找到原因:
如果代码是直接导入后,接着用对应的变量的,是可以动态提示的
而如果是放到函数中:
def orderSingleMsStoreProduct(productInfoDict):
global driver
multipleXpathRule = ‘//div[@class=”price-text srv_price”]/span[@aria-label] | //div[@class=”price-text srv_price”]/div[contains(@class, “price-disclaimer”)]/span[@aria-label]’
priceSpanElement = driver.find_element_by_xpath(multipleXpathRule)
PyCharm中貌似没法自动通过:
global driver
去解析到此处的driver就是前面的
driver = webdriver.Chrome()
得到的driver
所以就没法自动提示了。
对应从driver获取到的元素,也就没了自动完成。
pycharm variable inside function no auto complete
python – How to get PyCharm to auto-complete code in methods? – Stack Overflow
Type Hinting in PyCharm – Help | PyCharm
Type Hinting in PyCharm – Help | PyCharm
python – PyCharm autocomplete – Stack Overflow
@type conn: EC2Connection
是参数的写法啊,我这里是全局变量,不知道行不行,去试试
@type driver: WebDriver
结果好像不行。
不过对于参数来说,的确是可以的。
加之前:
加productInfoDict为dict:
之后:
此处以为是缺少了对应类型定义呢,所以去加上:
from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver
结果依旧没用。
pycharm global variable inside function no auto complete
pycharm global variable no auto complete
PyCharm 96.176 Release Notes – PyCharm – Confluence
PY-833 (Bug) No autocomplete for class methods within a class method definition
先看看我此处的PyCharm的版本:
PyCharm 2016.3.3
Build #PY-163.15188.4, built on March 11, 2017
Licensed to imsxm.com
JRE: 1.8.0_112-release-408-b6 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
之前96的版本就修复了,此处已经是163了,应该没此bug了才对
->
No autocomplete for class methods within a class method definition : PY-833
结果发现不是:全局变量的函数内无法自动完成 的bug。
为了能自动提示,此处可以考虑,把driver作为参数传递到函数内。
【总结】
然后测试了半天,结果是:
先说背景:
全局变量driver,PyCharm知道是WebDriver的类型了
(WebDriver完整的写法是:selenium.webdriver.remote.webdriver.WebDriver)
1.且和顶部的driver的初始化为None:
driver = None
没有关系
->
及时改为:
driver = webdriver.Chrome()
也不能让函数内的全局变量driver自动完成。
2.如果是driver当作参数传递进来
则函数的doc string中,无论是否添加:
@type driver: WebDriver
或:
@type driver: selenium.webdriver.remote.webdriver.WebDriver
则函数内部的driver都可以自动完成:
结论:
目前为了能让函数内部类型为WebDriver的全局变量driver能够自动完成,只能当作参数把函数外的,全局的driver,传递到函数内,则函数内的driver就可以自动完成了。
但是很明显这个是PyCharm的bug。
别人也提到过:
希望PyCharm尽快解决此bug。
【后记】
此处程序逻辑是是个全局的变量,所以不能每次都当作局部变量传递进去
否则函数内部操作的driver的变化,无法传递到全局的driver中,从而导致后续代码运行起来逻辑有问题,比如之前登录过了,后续却还要登录之类的。
所以:从程序逻辑角度来说,此处不能把driver设置为函数参数传递进来,就只能还是讲究,在没有自动完成的情况,继续用PyCharm写代码。
所以:还是只能等待PyCharm解决这个bug。
【后记2】
后来无意间通过:
“”“
中输入@t然后有个type和rtype:
然后经过一番继续折腾后发现:
<code>@type driver: selenium.webdriver.remote.webdriver </code>
时,后续是可以检测出selenium的driver的,至少后面有希望看到的:WebDriver
再继续折腾,结果是:
<code>@type driver: selenium.webdriver.remote.webdriver.WebDriver </code>
或:
<code>@type driver: selenium.webdriver.remote.webdriver.WebDriver </code>
都可以识别参数的类型WebDriver
而另外的:
<code>@:rtype driver: selenium.webdriver.remote.webdriver </code>
则好像没有影响。
【总结】
此处总之很是诡异的是:
用:
<code>@type driver: selenium.webdriver.remote.webdriver.WebDriver </code>
(或:
<code>@type driver: selenium.webdriver.remote.webdriver.WebDriver </code>
都)
可以成功让函数参数driver在后续的函数内,检测到变量类型为:
但是又发现,其实现象和之前一样:
如果加上
global driver
后,则无法动态提示(此处提示出来都是本文件内出现过的函数或字符串,不是库里面的):
所以目前结论是:
【总结】
作为全局变量的话,还是无法动态提示;
作为函数参数,可以用:
<code>@type driver: selenium.webdriver.remote.webdriver.WebDriver @:type driver: selenium.webdriver.remote.webdriver.WebDriver </code>
实现动态提示。