2021年6月

演示 IBM 中文打字机的女打字员

1947 年,IBM 推出了一款中文打字机,有 36 个键能打 5400 个汉字。在演示中,一位华裔女性熟练的敲出了一个个汉字。她是谁?斯坦福大学的中国史教授 Tom Mullaney 一篇关于中文打字机的博文吸引了一则留言,留言者称她就是那位打字员。她叫 Lois Lew,在 IBM 的宣传片里,她只有 22 岁,现在她 95 岁了。她出生在纽约,后来回到了中国。她 16 岁,又独自一人去了纽约,她不会多少英文,工作机会寥寥。这个时候 IBM 需要一位会说中文的人去演示它的中文打字机。Lew 去应聘后留用了她。但中文打字机从未能进入市场,而 Lew 在离开 IBM 之后开了一家中餐馆。

满满的历史沧桑感。这个故事很精彩,建议阅读一下上面的链接。

GCC 9.4 发布,不再强制要求代码贡献版权转让给 FSF

虽然 GCC 11 是 GCC 的最新稳定系列,但对于那些仍在使用 2019 年最初亮相的 GCC 9 的人来说,本周有一个新的点版本发布

长期以来,GCC 要求任何补丁都要向 FSF 转让版权,这对于某些人来说会是个问题。而鉴于 RMS 重返 FSF 董事层引发的风波,GCC 指导委员会决定不再强制要求有争议的版权转让。贡献者可以在他们的 Git 信息中使用带有 Signed-off-by 标签的开发者起源证书。该版权转让(以及 GPLv2 到 GPLv3 的变化)在十年前就阻止了苹果对 GCC 的贡献。版权转让在过去也阻止了其他组织对 GCC 的贡献。

现在看起来,FSF 之前的一些做法是有问题,应该根据社区对开源的认识采用得到更多人支持的做法。

俄罗斯地下论坛推出加密货币和 NFT 黑客竞赛活动

夺旗比赛、会议论文征集以及旨在让学习者掌握实践技能的网络安全课程中的游戏化,在白帽子领域都很常见;但在另一面,网络犯罪分子也在发起比赛,以创造新的进攻技术。

报道,在过去的一个月里,俄罗斯地下论坛的运营者一直在开展一项竞赛,悬赏十余万美元征集从盗窃加密货币私钥和钱包到提交“不寻常的”加密货币采矿软件,以及与智能合约和 NFT 有关的提案。

这种竞赛并不新鲜,地下论坛过去也曾推出征集各种漏洞方案的竞赛。但这也说明了加密货币是如何有利可图,而不仅仅是被用来支付勒索。

虽然 systemd 并非真正的故障定位工具,但其输出中的信息为解决问题指明了方向。

 title=

没有人会认为 systemd 是一个故障定位工具,但当我的 web 服务器遇到问题时,我对 systemd 和它的一些功能的不断了解帮助我找到并规避了问题。

我遇到的问题是这样,我的服务器 yorktown 为我的家庭办公网络提供名称服务 、DHCP、NTP、HTTPD 和 SendMail 邮件服务,它在正常启动时未能启动 Apache HTTPD 守护程序。在我意识到它没有运行之后,我不得不手动启动它。这个问题已经持续了一段时间,我最近才开始尝试去解决它。

你们中的一些人会说,systemd 本身就是这个问题的原因,根据我现在了解的情况,我同意你们的看法。然而,我在使用 SystemV 时也遇到了类似的问题。(在本系列文章的 第一篇 中,我探讨了围绕 systemd 作为旧有 SystemV 启动程序和启动脚本的替代品所产生的争议。如果你有兴趣了解更多关于 systemd 的信息,也可以阅读 第二篇第三篇 文章。)没有完美的软件,systemd 和 SystemV 也不例外,但 systemd 为解决问题提供的信息远远多于 SystemV。

确定问题所在

找到这个问题根源的第一步是确定 httpd 服务的状态:

[root@yorktown ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Thu 2020-04-16 11:54:37 EDT; 15min ago
     Docs: man:httpd.service(8)
  Process: 1101 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
 Main PID: 1101 (code=exited, status=1/FAILURE)
   Status: "Reading configuration..."
      CPU: 60ms

Apr 16 11:54:35 yorktown.both.org systemd[1]: Starting The Apache HTTP Server...
Apr 16 11:54:37 yorktown.both.org httpd[1101]: (99)Cannot assign requested address: AH00072: make_sock: could not bind to address 192.168.0.52:80
Apr 16 11:54:37 yorktown.both.org httpd[1101]: no listening sockets available, shutting down
Apr 16 11:54:37 yorktown.both.org httpd[1101]: AH00015: Unable to open logs
Apr 16 11:54:37 yorktown.both.org systemd[1]: httpd.service: Main process exited, code=exited, status=1/FAILURE
Apr 16 11:54:37 yorktown.both.org systemd[1]: httpd.service: Failed with result 'exit-code'.
Apr 16 11:54:37 yorktown.both.org systemd[1]: Failed to start The Apache HTTP Server.
[root@yorktown ~]#

这种状态信息是 systemd 的功能之一,我觉得比 SystemV 提供的任何功能都要有用。这里的大量有用信息使我很容易得出逻辑性的结论,让我找到正确的方向。我从旧的 chkconfig 命令中得到的是服务是否在运行,以及如果它在运行的话,进程 ID(PID)是多少。这可没多大帮助。

该状态报告中的关键条目显示,HTTPD 不能与 IP 地址绑定,这意味着它不能接受传入的请求。这表明网络启动速度不够快,因为 IP 地址还没有设置好,所以 HTTPD 服务还没有准备好与 IP 地址绑定。这是不应该发生的,所以我查看了我的网络服务的 systemd 启动配置文件;在正确的 afterrequires 语句下,所有这些似乎都没问题。下面是我服务器上的 /lib/systemd/system/httpd.service 文件:

# Modifying this file in-place is not recommended, because changes 
# will be overwritten during package upgrades.  To customize the 
# behaviour, run "systemctl edit httpd" to create an override unit.

# For example, to pass additional options (such as -D definitions) to 
# the httpd binary at startup, create an override unit (as is done by                             
# systemctl edit) and enter the following:                                           

#    [Service]
#    Environment=OPTIONS=-DMY_DEFINE             

[Unit]                                               
Description=The Apache HTTP Server
Wants=httpd-init.service
After=network.target remote-fs.target nss-lookup.target httpd-init.service
Documentation=man:httpd.service(8)

[Service]
Type=notify
Environment=LANG=C

ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
# Send SIGWINCH for graceful stop
KillSignal=SIGWINCH
KillMode=mixed
PrivateTmp=true

[Install]
WantedBy=multi-user.target

httpd.service 单元文件明确规定,它应该在 network.targethttpd-init.service(以及其他)之后加载。我试着用 systemctl list-units 命令找到所有这些服务,并在结果数据流中搜索它们。所有这些服务都存在,应该可以确保在设置网络 IP 地址之前,httpd 服务没有加载。

第一个解决方案

在互联网上搜索了一下,证实其他人在 httpd 和其他服务也遇到了类似的问题。这似乎是由于其中一个所需的服务向 systemd 表示它已经完成了启动,但实际上它却启动了一个尚未完成的子进程。通过更多搜索,我想到了一个规避方法。

我搞不清楚为什么花了这么久才把 IP 地址分配给网卡。所以我想,如果我可以将 HTTPD 服务的启动推迟合理的一段时间,那么 IP 地址就会在那个时候分配。

幸运的是,上面的 /lib/systemd/system/httpd.service 文件提供了一些方向。虽然它说不要修改它,但是它还是指出了如何操作:使用 systemctl edit httpd 命令,它会自动创建一个新文件(/etc/systemd/system/httpd.service.d/override.conf)并打开 GNU Nano 编辑器(如果你对 Nano 不熟悉,一定要看一下 Nano 界面底部的提示)。

在新文件中加入以下代码并保存:

[root@yorktown ~]# cd /etc/systemd/system/httpd.service.d/
[root@yorktown httpd.service.d]# ll
total 4
-rw-r--r-- 1 root root 243 Apr 16 11:43 override.conf
[root@yorktown httpd.service.d]# cat override.conf
# Trying to delay the startup of httpd so that the network is
# fully up and running so that httpd can bind to the correct
# IP address
#
# By David Both, 2020-04-16

[Service]
ExecStartPre=/bin/sleep 30

这个覆盖文件的 [Service] 段有一行代码,将 HTTPD 服务的启动时间推迟了 30 秒。下面的状态命令显示了等待时间里的服务状态:

[root@yorktown ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/httpd.service.d
           └─override.conf
           /usr/lib/systemd/system/httpd.service.d
           └─php-fpm.conf
   Active: activating (start-pre) since Thu 2020-04-16 12:14:29 EDT; 28s ago
     Docs: man:httpd.service(8)
Cntrl PID: 1102 (sleep)
    Tasks: 1 (limit: 38363)
   Memory: 260.0K
      CPU: 2ms
   CGroup: /system.slice/httpd.service
           └─1102 /bin/sleep 30

Apr 16 12:14:29 yorktown.both.org systemd[1]: Starting The Apache HTTP Server...
Apr 16 12:15:01 yorktown.both.org systemd[1]: Started The Apache HTTP Server.
[root@yorktown ~]#

这个命令显示了 30 秒延迟过后 HTTPD 服务的状态。该服务已经启动并正常运行。

[root@yorktown ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/httpd.service.d
           └─override.conf
           /usr/lib/systemd/system/httpd.service.d
           └─php-fpm.conf
   Active: active (running) since Thu 2020-04-16 12:15:01 EDT; 1min 18s ago
     Docs: man:httpd.service(8)
  Process: 1102 ExecStartPre=/bin/sleep 30 (code=exited, status=0/SUCCESS)
 Main PID: 1567 (httpd)
   Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec:   0 B/sec"
    Tasks: 213 (limit: 38363)
   Memory: 21.8M
      CPU: 82ms
   CGroup: /system.slice/httpd.service
           ├─1567 /usr/sbin/httpd -DFOREGROUND
           ├─1569 /usr/sbin/httpd -DFOREGROUND
           ├─1570 /usr/sbin/httpd -DFOREGROUND
           ├─1571 /usr/sbin/httpd -DFOREGROUND
           └─1572 /usr/sbin/httpd -DFOREGROUND

Apr 16 12:14:29 yorktown.both.org systemd[1]: Starting The Apache HTTP Server...
Apr 16 12:15:01 yorktown.both.org systemd[1]: Started The Apache HTTP Server.

我本来可以实验下更短的延迟时间是否也能奏效,但是我的系统并不用那么严格,所以我觉得不这样做。目前系统的工作状态很可靠,所以我很高兴。

因为我收集了所有这些信息,我将其作为 Bug1825554 报告给红帽 Bugzilla。我相信报告 Bug 比抱怨 Bug 更有有用。

更好的解决方案

把这个问题作为 bug 上报几天后,我收到了回复,表示 systemd 只是一个管理工具,如果 httpd 需要在满足某些要求之后被拉起,需要在单元文件中表达出来。这个回复指引我去查阅 httpd.service 的手册页。我希望我能早点发现这个,因为它是比我自己想出的更优秀的解决方案。这种方案明确的针对了前置目标单元,而不仅仅是随机延迟。

来自 httpd.service 手册页:

在启动时开启服务

httpd.servicehttpd.socket 单元默认是 禁用 的。为了在启动阶段开启 httpd 服务,执行:systemctl enable httpd.service。在默认配置中,httpd 守护进程会接受任何配置好的 IPv4 或 IPv6 地址的 80 口上的连接(如果安装了 mod\_ssl,就会接受 443 端口上的 TLS 连接)。

如果 httpd 被配置成依赖任一特定的 IP 地址(比如使用 Listen 指令),该地址可能只在启动阶段可用,又或者 httpd 依赖其他服务(比如数据库守护进程),那么必须配置该服务,以确保正确的启动顺序。

例如,为了确保 httpd 在所有配置的网络接口配置完成之后再运行,可以创建一个带有以下代码段的 drop-in 文件(如上述):

[Unit]
After=network-online.target
Wants=network-online.target

我仍然觉得这是个 bug,因为在 httpd.conf 配置文件中使用 Listen 指令是很常见的,至少在我的经验中。我一直在使用 Listen 指令,即使在只有一个 IP 地址的主机上,在多个网卡和 IP 地址的机器上这显然也是有必要的。在 /usr/lib/systemd/system/httpd.service 默认配置文件中加入上述几行,对不使用 Listen 指令的不会造成问题,对使用 Listen 指令的则会规避这个问题。

同时,我将使用建议的方法。

下一步

本文描述了一个我在服务器上启动 Apache HTTPD 服务时遇到的一个问题。它指引你了解我在解决这个问题上的思路,并说明了我是如何使用 systemd 来协助解决问题。我也介绍了我用 systemd 实现的规避方法,以及我按照我的 bug 报告得到的更好的解决方案。

如我在开头处提到的那样,这有很大可能是一个 systemd 的问题,特别是 httpd 启动的配置问题。尽管如此,systemd 还是提供了工具让我找到了问题的可能来源,并制定和实现了规避方案。两种方案都没有真正令我满意地解决问题。目前,这个问题根源依旧存在,必须要解决。如果只是在 /usr/lib/systemd/system/httpd.service 文件中添加推荐的代码,那对我来说是可行的。

在这个过程中我发现了一件事,我需要了解更多关于定义服务启动顺序的知识。我会在下一篇文章中探索这个领域,即本系列的第五篇。

资源

网上有大量的关于 systemd 的参考资料,但是大部分都有点简略、晦涩甚至有误导性。除了本文中提到的资料,下列的网页提供了跟多可靠且详细的 systemd 入门信息。

  • Fedora 项目有一篇切实好用的 systemd 入门,它囊括了几乎所有你需要知道的关于如何使用 systemd 配置、管理和维护 Fedora 计算机的信息。
  • Fedora 项目也有一个不错的 备忘录,交叉引用了过去 SystemV 命令和 systemd 命令做对比。
  • 关于 systemd 的技术细节和创建这个项目的原因,请查看 Freedesktop.org 上的 systemd 描述
  • Linux.com 的“更多 systemd 的乐趣”栏目提供了更多高级的 systemd 信息和技巧

此外,还有一系列深度的技术文章,是由 systemd 的设计者和主要开发者 Lennart Poettering 为 Linux 系统管理员撰写的。这些文章写于 2010 年 4 月至 2011 年 9 月间,但它们现在和当时一样具有现实意义。关于 systemd 及其生态的许多其他好文章都是基于这些文章:


via: https://opensource.com/article/20/5/systemd-troubleshooting-tool

作者:David Both 选题:lujun9972 译者:tt67wq 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

有一天,我试图在一个新的 Ubuntu 系统上编译一个程序,当我试图使用 make 命令时,它向我抛出一个错误:

The program 'make' is currently not installed. You can install it by typing:
sudo apt install make

这表明 make 命令还没有安装。你可以用这些命令在 Ubuntu 上逐步安装 make

sudo apt update
sudo apt install make

第一个命令是更新本地的软件包缓存。如果是一个新安装的 Ubuntu 系统,这是很有必要的。有了刷新的软件包缓存,你的系统就会知道应该从哪个仓库下载 make 包。

并验证 make 是否已经正确安装:

make --version

Checking make version

在 Ubuntu 上安装 make 的更好方法

安装 make 命令的一个更好的方法是使用 build-essential 包。这个包包含 makegccg++ 和其他一些编译器和开发工具。

sudo apt install build-essential

Installing Build Essential package

安装了这个 build-essential 包后,你就可以在 Linux 中轻松地运行 C/C++ 程序

如果 make 已经安装了,但它没有工作怎么办?

在一些罕见的情况下,可能会发生 make 已经安装了,但却无法工作的情况。

其原因是 make 命令不在 $PATH 变量中。你可以用这个命令重新安装 make

sudo apt install --reinstall make

如果这不起作用,你可以尝试 手动添加二进制文件到你的 PATH 中,但这应该不需要手动。

我希望这个快速提示能帮助你。仍然有问题或对相关主题有疑问?请随时在评论区留言。


via: https://itsfoss.com/make-command-not-found-ubuntu/

作者:Abhishek Prakash 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

蚂蚁再次开源 OceanBase 数据库

从 2010 诞生以来,OceanBase 再次开源了。在 6 月 1 日召开的 OceanBase 发布会上,蚂蚁旗下的奥星贝斯公司发布了最新的 OceanBase 3.0 版本,并宣布全面开源,采用 “Open Core” 模式。此次开源采用了国产的木兰许可证 MulanPubL-2.0,开源了多达 300 万行的核心代码。OceanBase 称,“同时具备了在事务处理和数据分析两类任务的高性能能力,升级为一款支持 HTAP 混合负载的企业级分布式数据库。和过去相比,事务处理性能提升 50%,数据分析性能提升 10 倍。”

据一些反馈称,OceanBase 数据库指标不错。虽然经历了开源、闭源又开源,但是最终还是走向了开源,并日益强大,也值得肯定。

AI 出现在战争之中

以色列军方称,最近在加沙地带爆发的以巴冲突是世界首次 AI 战争,AI 首次成为战争中的力量倍增器。以色列军队除了依赖已有的情报,军方还在之前几年建立一个 AI 技术平台,对收集到的所有数据进行分析,利用 AI 向情报部队生成建议,情报部队根据建议制定高价值目标,交给军方实施打击。军方相信使用 AI 有助于缩短战斗时间。

此外,也有报道称,一架携带武器的无人机在没有指定命令的情况下自主猎杀了一个人类目标

科技的进步,不知道最终是造福人类,还是消灭人类。

谷歌承诺 FLoC 隐私沙箱不留后门,广告商对此持怀疑态度

谷歌一直在积极向 Web 浏览器的 Cookie 发起战争,尤其是那些严重侵犯用户隐私的第三方跨站追踪 Cookie。谷歌给出了两个解决方案:其一是隐私沙箱,另一个就是所谓的“联合学习队列”(FLoC)。

但是包括电子前沿基金会(EFF)在内的组织机构、各大浏览器开发商、甚至广告商们,都对谷歌的 FLoC 追踪提出了严厉的批评。谷歌称,该公司不会在 FLoC 中留有后门,也不会按照其它广告商与合作伙伴的规则意图来行事。但是这并不让人信服,因为谷歌拥有保留第一方属性的个人用户数据的权利,意味着本质上仍可能换汤不换药。更何况,谷歌很有可能在不久的将来推翻这一承诺,正如此前屡次发生过的类似事件那样。

从一个广告商的角度来做的这些事情,自然没有足够的说服力让大家相信,更何况谷歌早放弃了“不作恶”守则。

你可以得到很多适用于 Linux 的开源网页浏览器,不只是基于 Chrome 的浏览器,而且还有 其它的替代品

它们大多数都侧重于提供漂亮的用户体验,并同时兼顾隐私功能。

然而,Nyxt 浏览器可能不是为最好的用户体验而建立的,而是为资深用户喜欢的某些东西而打造的。

Nyxt 浏览器:专注于键盘快捷键和命令的开源浏览器

Nyxt 是一个面向键盘的开源网页浏览器,可在 Linux 和 macOS 上使用。

当然,不是每个资深用户都会去使用键盘快捷键,但这旨在满足那些喜欢通过键盘导航的用户的需求。

它的灵感来自于 Vim 和 Emacs 中的键盘快捷键的工作方式 —— 所以如果你对这些编辑器很熟悉,那么你也会对这些快捷键感到熟悉。

与主流的网页浏览器不同,你不必在多个设置和菜单中导航,只需一个快速快捷键或一个命令,你就会获得所有你需要访问的功能。

如果你想知道的话,它不特定于某种网页引擎,它目前支持 WebEngine 和 WebKit。

因此,如果你是一个喜欢使用键盘导航的人,它可以节省时间并改善你的浏览体验。

它提供了相当多的有用功能,我将在下面指出。

Nyxt 浏览器的特点

你会发现这里提供了许多非常规的功能。在探索这里提到的每一个关键亮点之前,你可能想先浏览一下官方文档(按 F1 找到它),你可以在欢迎屏幕中可以找到链接。

  • 无损的树形的历史记录(跟踪你的浏览历史的确切层次,并轻松回忆你导航到的内容)
  • 剪贴板历史,帮助你快速找到你之前复制的内容
  • 开始输入命令的键盘快捷方式(CTRL+Space
  • 使用键盘快捷键在冗长的文件中导航,可以跳到一个特定的标题
  • 缓冲区替代了标签,它将每个标签的行为和设置相互隔离
  • 通过将多个标签映射到一个共同的元素来一同关闭
  • 无鼠标导航
  • 使用搜索快速找到一个缓冲区,而不是在许多标签中寻找它
  • 能够根据你的工作流程运行简短的脚本
  • 可定制的自动填写功能,你也可以在表单中自动填写当前日期
  • 内置的广告拦截器

除了上面提到的功能外,你还可以切换黑暗模式HTTPS 模式,以及在命令菜单中有大量的选项。

此外,它是完全可定制和可编程的。因此,你可以选择为自己量身定做。

在 Linux 中安装 Nyxt 浏览器

对于基于 Ubuntu 的发行版,你可以从 官方下载页面 找到一个 deb 包。

如果你还不会,你可能想读一下 安装 deb 文件的方法

它也为 Arch Linux 用户提供了 AUR,并为 Alpine Linux、Nix 和 Guix 提供了包。

如果你需要编译它,你也可以在 GitHub 页面 中找到源代码。

总结

虽然 Nyxt 浏览器可能不是最友好的浏览体验,但对于能够充分利用键盘快捷键和命令的用户来说,它肯定是一个特殊的选择。

如果你想要一个无鼠标的导航体验,这是一个值得尝试的浏览器。我建议你尝试一下 —— 但如果你一般不使用键盘快捷键来导航,这对你来说将是一个复杂的体验。

你尝试过 Nyxt 浏览器吗?请在下面的评论中告诉我你的想法。


via: https://itsfoss.com/nyxt-browser/

作者:Ankush Das 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

探索一些未被充分利用但仍然有用的 Python 特性。

 title=

这是 Python 3.x 首发特性系列文章的第六篇。Python 3.5 在 2015 年首次发布,尽管它已经发布了很长时间,但它引入的许多特性都没有被充分利用,而且相当酷。下面是其中的三个。

@ 操作符

@ 操作符在 Python 中是独一无二的,因为在标准库中没有任何对象可以实现它!它是为了在有矩阵的数学包中使用而添加的。

矩阵有两个乘法的概念。元素积是用 * 运算符完成的。但是矩阵组合(也被认为是乘法)需要自己的符号。它是用 @ 完成的。

例如,将一个“八转”矩阵(将轴旋转 45 度)与自身合成,就会产生一个四转矩阵。

import numpy

hrt2 = 2**0.5 / 2
eighth_turn = numpy.array([
    [hrt2, hrt2],
    [-hrt2, hrt2]
])
eighth_turn @ eighth_turn
    array([[ 4.26642159e-17,  1.00000000e+00],
           [-1.00000000e+00, -4.26642159e-17]])

浮点数是不精确的,这比较难以看出。从结果中减去四转矩阵,将其平方相加,然后取其平方根,这样就比较容易检查。

这是新运算符的一个优点:特别是在复杂的公式中,代码看起来更像基础数学:

almost_zero = ((eighth_turn @ eighth_turn) - numpy.array([[0, 1], [-1, 0]]))**2
round(numpy.sum(almost_zero) ** 0.5, 10)
    0.0

参数中的多个关键词字典

Python 3.5 使得调用具有多个关键字-参数字典的函数成为可能。这意味着多个默认值的源可以与更清晰的代码”互操作“。

例如,这里有个可笑的关键字参数的函数:

def show_status(
    *,
    the_good=None,
    the_bad=None,
    the_ugly=None,
    fistful=None,
    dollars=None,
    more=None
):
    if the_good:
        print("Good", the_good)
    if the_bad:
        print("Bad", the_bad)
    if the_ugly:
        print("Ugly", the_ugly)
    if fistful:
        print("Fist", fistful)
    if dollars:
        print("Dollars", dollars)
    if more:
        print("More", more)

当你在应用中调用这个函数时,有些参数是硬编码的:

defaults = dict(
    the_good="You dig",
    the_bad="I have to have respect",
    the_ugly="Shoot, don't talk",
)

从配置文件中读取更多参数:

import json

others = json.loads("""
{
"fistful": "Get three coffins ready",
"dollars": "Remember me?",
"more": "It's a small world"
}
""")

你可以从两个源一起调用这个函数,而不必构建一个中间字典:

show_status(**defaults, **others)
    Good You dig
    Bad I have to have respect
    Ugly Shoot, don't talk
    Fist Get three coffins ready
    Dollars Remember me?
    More It's a small world

os.scandir

os.scandir 函数是一种新的方法来遍历目录内容。它返回一个生成器,产生关于每个对象的丰富数据。例如,这里有一种打印目录清单的方法,在目录的末尾跟着 /

for entry in os.scandir(".git"):
    print(entry.name + ("/" if entry.is_dir() else ""))
    refs/
    HEAD
    logs/
    index
    branches/
    config
    objects/
    description
    COMMIT_EDITMSG
    info/
    hooks/

欢迎来到 2015 年

Python 3.5 在六年前就已经发布了,但是在这个版本中首次出现的一些特性非常酷,而且没有得到充分利用。如果你还没使用,那么将他们添加到你的工具箱中。


via: https://opensource.com/article/21/5/python-35-features

作者:Moshe Zadka 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出