M

完了,四个都成了黑历史。找出了明显的翻译错误……我说怎么读都读不通……


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->”的时候,就会弹出合适的自动完成列表。这样很适合在类型不熟悉的时候帮助探索。

分享到 评论