完了,四个都成了黑历史。找出了明显的翻译错误……我说怎么读都读不通……
09-19
学校网络最近总是时好时坏,坏的时候只能顺畅打开百度首页和博客园,其他的126啊Bangumi啊B站啊GH啊全都连接超时。
Python 对新手很不友好,这是它留给我的第一印象,虽然很多人说入门语言应该选 Python。隐式的类型推断(但是执行时是强类型)让智能感知很费劲。
我选用的 IDE 是 PyCharm。想从一个简单的示例入手:
import urllib2
url = "http://www.baidu.com/"
response = urllib2.urlopen(url)
到此为止,都是能从名称中看出来的。但是当我尝试使用 reponse
的时候,敲下“.
”却没有任何提示——我根本就不知道它返回的类型是什么。是字符串吗?应该不是,至少要有一个网络错误时的 fallback 吧。如果是一个类,公开了哪些方法呢?看不出。
后来我从网上看到 urllib2 的使用,后面是
print response.read()
突然就冒出一个 read()
方法。由此又得想,如果我只需要读取一部分数据呢?如果网络状况不佳导致超时呢?Python 肯定提供了相关的机制,可是根本就看不到。
去看 Python 的 urllib2 文档,关于 urlopen()
方法是这样描述的:
This function returns a file-like object with three additional methods:
geturl()
— return the URL of the resource retrieved, commonly used to determine if a redirect was followed
info()
— return the meta-information of the page, such as headers, in the form of an mimetools.Message
instance (see Quick Reference to HTTP Headers)
getcode()
— return the HTTP status code of the response.
这才知道,原来返回的是一个和普通文件类似的 object。那么文件对象有什么成员呢?
f = open("")
然后查看 f
的成员,才能看到文件对象的成员。很不幸,如果我要使用的话,必须要记住每个常用类型的成员,如果是函数还加上签名,要不由 urlopen()
返回的东西在 PyCharm 眼中就是白板,根本就不知道怎么用。也就是说,如果我现在要去写 Python,要不智能感知就得做好一点,要不就得抱着整个文档去查。
VS + IronPython 还没有尝试,不过估计会好一些。
VB 和 VB .NET 有着强大的延迟绑定(late binding)能力,后来 C# 4.0 中引入了 dynamic
。这功能我总觉得是烫手山芋,因为如果没有目标的文档根本就难以开发和维护。例如:
Dim o As Object
' VB 语法
Set o = CreateObject("Excel.Application")
' VB .NET 语法
o = CreateObject("Excel.Application")
接下来知道怎么干些什么吗?不知道,因为此时 o
的类型还是普通的 Object
,不带具体的成员信息。相比之下,如果引用了类库,强类型化后再操作就好多了:
' VB 在工程中添加对 Excel 的类型库引用即可
' VB .NET 在工程中添加对 Excel 的互操作程序集引用之后,在使用其的文件内写上这一行
Imports Microsoft.Office.Interop.Excel
' 使用上是相同的
Dim o As New Excel.Application()
o.Quit()
剩下就好办了。因为类型是契约(contract)的一种(我指的不只是接口意义上的契约),有了明确引导后沟通就方便多了。例如,PHP(PhpStorm 下)和 JavaScript(WebStorm 下)都可以在注释中指定类型来影响智能感知的行为:
/**
* @var string $host
* @var string $username
* @var string $password
* @var string $database
* @var int $port
* @var mysqli $mysqli
*/
$mysqli = new mysqli($host, $username, $password, $database, $port);
echo $mysqli->connect_error;
当你输入“$mysqli->
”的时候,就会弹出合适的自动完成列表。这样很适合在类型不熟悉的时候帮助探索。