当已经会编程时再学习 Python,会面临一个奇怪的问题。你不需要别人解释什么是变量、条件或循环,但仅仅记住更简洁的语法也不够。困难在于恢复——或者说构建——写出在生产环境中自然、可维护且可预测的 Python 所需的判断力。 最有效的进步方式不是压缩一门初学者课程,而是改变学习顺序:从那些影响你设计决策的差异开始,并在可以运行、也可以刻意弄坏的短小示例中逐一练习。 1. 翻译心智模型,而不是逐行翻译代码 从 Java、C#、JavaScript、Go 或 C++ 过来的人,通常首先会把自己已经知道的东西逐字翻译过来。程序能运行,但保留了 Python 不需要的结构、抽象和仪式感。 建议尽早审视以下问题: • 可变性、别名和同一性; • 解包、推导式和惰性迭代; • 作为对象的函数和闭包; • 上下文管理器; • dataclasses 与数据边界; • 能使代码融入语言对象模型的特殊方法。 这些不是冷知识。它们解释了为什么两个正确的实现可能在清晰度和行为上相差很大。 2. 用类型标注设计边界 注解在描述契约时才有价值。一个 Protocol、一个窄化的返回类型或一个定义良好的 callable,可以把策略与其实现分开,让 API 更易于测试。 相反,用注解填满每个局部变量很少能改进设计。一个好的练习是:先定义组件的公共接口,再创建多个满足该接口的实现。这样一来,类型标注就不再是装饰,而成了发现耦合的工具。 3. 根据负载选择并发模型 Python 提供了多种模型,但没有一种放之四海而皆准: • 线程适合阻塞式输入/输出操作; • 进程可以把 CPU 密集型工作隔离开来; • 当许多协作任务大部分时间都在等待时,asyncio 很有用。...

#buildinpublic #SeniorGo 从零开始用Golang搭建HTTP服务器 Go语言自带一个健壮、强大且可用于生产的HTTP服务器。而且它非常易于使用,同时又不失灵活性和可配置性,甚至能精确到最微小的细节。 http包包含了一个Server对象,它拥有我们所需的一切。启动它所需的最基本属性是Addr和Handler。 Addr Addr 是服务器将要监听的地址,是一个格式为 :<端口> 的字符串。例如,如果我们想接收网络上任何计算机通过8080端口发来的请求,可以设置为 :8080 或 0.0.0.0:8080 。如果我们在开发时,可以使用 127.0.0.1:8080 ,这样只有本机才能访问(这在Mac上非常有用,可以避免频繁弹出防火墙提示)。 Handler Handler 是一个函数,每当服务器收到HTTP请求时都会被调用。该函数拥有一个 ResponseWriter 用于发送响应,以及一个 Request 用于读取客户端请求。 在接下来的示例中,我们记录HTTP方法和URL的日志,然后返回 "Hello World!!" 作为响应。 package main import ( "log" "net/http" ) func main() { s := &http.Server{ Addr: ":8080", Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Println(r.Method, r.URL) w.Write([]byte("Hello World!!")) }), } err := s.ListenAndServe() if err != nil { log.Fatal(err) } } 如果服务器启动一切顺利,执行将停在 ListenAndServe...

Gopress,一个使用Golang的博客(第8部分) 大家好!我们继续关于如何使用Golang(由 Google 创建 且越来越流行的编程语言)构建博客的系列教程。如果你错过了前面的部分,请前往我们之前的文章,并跟上进度。今天,在系列的第八部分中,我们将重点放在身份验证和安全性上。让我们开始吧! 复选框 一 二 三 身份验证与安全性 到目前为止,我们已经创建了具备基本功能的博客Gopress,但尚未实现任何身份验证机制。我们不希望任何人都能在我们的博客上发表、编辑或删除内容。为了防止这种情况,我们需要实现一个身份验证系统。 在Golang中,有多个库可帮助我们进行身份验证,但在本教程中,我们将使用“gorilla/sessions”来处理用户会话,并使用“golang.org/x/crypto/bcrypt”进行密码哈希处理。 使用Gorilla/Sessions实现会话 首先,我们需要 安装 Gorilla Sessions包。如果你使用go modules,可以通过以下命令完成: bashCopy codego get github.com/gorilla/sessions 首先,我们定义一个全局变量来存储会话: goCopy codevar ( key = []byte("super-secret-key") store = sessions.NewCookieStore(key) ) 完成之后,我们可以实现一个函数,在成功登录后设置会话: goCopy codefunc setSession(userName string, w http.ResponseWriter, r *http.Request) { session, _ := store.Get(r, "cookie-name") session.Values["authenticated"] = true session.Values["username"] = userName session.Save(r, w) } 另一个函数用于检查用户是否已认证:...