2021年5月

Google 员工承认用户无法在公司的限制下保护自己的隐私

根据 The Verge 的报道,在一场针对 Google 的诉讼中所暴露出来的原始文件表示,Google 的高管和工程师都知道,公司让用户保护自己的位置数据的隐私有多么的困难。

在昨天的硬核观察中,我们提到, Google 表示自己不会在设定功能的时候为自己添加后门,但同时我们也表达了对此的不信任。如今可以看到,Google 在种种方面依然表现出对于个人隐私的渴望。毕竟,他需要通过隐私来获取广告收益。

微软为开发者推出了 Java 开发文档

微软发布了其 OpenJDK 的 GA (一般可用版本),并且发布了新的 Java 开发教程,帮助开发者在 Windows 上更好的开发 Java 应用程序。此次发布提供了 OpenJDK、VScode 插件、Github 使用指南、Java 在 Azure 上的部署教程等信息。

作为一门使用人数众多的编程语言,终于 Java 也进入了微软的支持列表,为开发者提供了一系列的使用指南。

Jim Keller:AMD 员工曾认为无法超越 Intel

在 anandtech 的一个针对 Tenstorrent 公司的访谈中,该公司 CTO Jim Keller,前 AMD Zen 架构的研发团队负责人,谈到了一些关于 AMD Zen 的轶闻。他提到,在设计 Zen 的时候,一小部分人相信 Zen 将会在一代人的时间内追赶上 Intel;一部分人认为如果成功了,那会非常的酷;更多的人都认为这个事情不可能。

AMD Zen 架构的成功我们都看在眼里,这让我想起了一句话,「悲观者往往正确,但乐观者往往成功」,正是像 Jim Keller 这样的乐观者,最终带着工程师们做出了 AMD 的 Zen 架构,让 AMD 成功翻身做主人。

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

 title=

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

枚举

我最喜欢的逻辑谜题之一是自我描述的 史上最难的逻辑谜题。在其中,它谈到了三个“神”,他们被称为 A、B 和 C,他们的身份是真、假和随机,按一定顺序排列。你可以问他们问题,但他们只用神的语言回答,其中 “da” 和 “ja” 表示 “是” 和 “不是”,但你不知道哪个是哪个。

如果你决定使用 Python 来解决这个问题,你将如何表示神的名字和身份以及神的语言中的词语?传统的答案是使用字符串。然而,字符串的拼写错误可能会带来灾难性的后果。

如果在解题的关键部分,你用字符串 “jaa” 而不是 “ja” 进行比较,你就会得到一个错误的答案。虽然谜题没有说明风险是什么,但这可能是最好的避免方式。

enum 模块让你能够以一种可调试但安全的方式来定义这些东西:

import enum

@enum.unique
class Name(enum.Enum):
    A = enum.auto()
    B = enum.auto()
    C = enum.auto()
   
@enum.unique
class Identity(enum.Enum):
    RANDOM = enum.auto()
    TRUE = enum.auto()
    FALSE = enum.auto()

       
@enum.unique
class Language(enum.Enum):
    ja = enum.auto()
    da = enum.auto()

枚举的一个好处是,在调试日志或异常中,枚举的呈现方式是有帮助的:

name = Name.A
identity = Identity.RANDOM
answer = Language.da
print("I suspect", name, "is", identity, "because they answered", answer)
    I suspect Name.A is Identity.RANDOM because they answered Language.da

functools.singledispatch

在开发游戏的“基础设施”层时,你想通用地处理各种游戏对象,但仍然允许这些对象自定义动作。为了使这个例子更容易解释,假设这是一个基于文本的游戏。当你使用一个对象时,大多数情况下,它只会打印 You are using <x>。但是使用一把特殊的剑可能需要随机滚动,否则会失败。

当你获得一个物品时,它通常会被添加到库存中。然而,一块特别重的石头会砸碎一个随机物品。如果发生这种情况,库存中会失去该物体。

处理这个问题的一个方法是在物品上设置 useacquire 方法。随着游戏复杂性的增加,这些方法会越来越多,使游戏对象变得难以编写。

相反,functools.singledispatch 允许你以安全和尊重命名空间的方式追溯性地添加方法。

你可以定义没有行为的类:

class Torch:
    name="torch"

class Sword:
    name="sword"

class Rock:
    name="rock"
import functools

@functools.singledispatch
def use(x):
    print("You use", x.name)

@functools.singledispatch
def acquire(x, inventory):
    inventory.add(x)

对于火炬来说,这些通用的实现已经足够了:

inventory = set()

def deploy(thing):
    acquire(thing, inventory)
    use(thing)
    print("You have", [item.name for item in inventory])

deploy(Torch())
    You use torch
    You have ['torch']

然而,剑和石头需要一些专门的功能:

import random

@use.register(Sword)
def use_sword(sword):
    print("You try to use", sword.name)
    if random.random() < 0.9:
        print("You succeed")
    else:
        print("You fail")

deploy(sword)
    You try to use sword
    You succeed
    You have ['sword', 'torch']
import random

@acquire.register(Rock)
def acquire_rock(rock, inventory):
    to_remove = random.choice(list(inventory))
    inventory.remove(to_remove)
    inventory.add(rock)

deploy(Rock())
    You use rock
    You have ['sword', 'rock']

岩石可能压碎了火炬,但你的代码更容易阅读。

pathlib

从一开始,Python 中文件路径的接口就是“智能字符串操作”。现在,通过 pathlib,Python 有了一种面向对象的方法来操作路径。

import pathlib
gitconfig = pathlib.Path.home() / ".gitconfig"
text = gitconfig.read_text().splitlines()

诚然,用 / 作为操作符来生成路径名有点俗气,但在实践中却不错。像 .read_text() 这样的方法允许你从小文件中获取文本,而不需要手动打开和关闭文件句柄。

这使你可以集中精力处理重要的事情:

for line in text:
    if not line.strip().startswith("name"):
        continue
    print(line.split("=")[1])
     Moshe Zadka

欢迎来到 2014 年

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


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

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

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

/e/ 安卓操作系统是一个以隐私为导向的去谷歌化的移动操作系统,是 Lineage OS 的复刻,由 Mandrake Linux(现在的 Mandriva Linux)的创建者 Gaël Duval 于 2018 年中期创立。

尽管安卓在 2007 年成为了一个开源项目,但当安卓得到普及时,谷歌使用专有软件取代了一些操作系统元素。/e/ 基金会用 MicroG 取代了其中的专有的应用程序和服务,这是一个开源的替代框架,可以最大限度地减少跟踪和设备活动。

我们收到的 Fairphone 3 预装了 /e/ OS,这是一个来自 /e/ 基金会的 以道德的方式创造的智能手机。我使用了一个月这个设备,然后把它返还给了他们,我将分享我对这个隐私设备的体验。我忘了截图,所以我将分享来自官方网站的通用图片。

在道德的 Fairphone 设备上体验 /e/ 移动操作系统

在我进一步说明之前,让我澄清一下,Fairphone 3 并不是使用 /e/ 的唯一选择。如果你要从他们那里购买设备,/e/ 基金会会给你 一些智能手机的选择

你不需要购买设备来使用 /e/ OS。按照 /e/ 基金会的说法,你可以 在 100 多个支持的设备上使用它

尽管我很喜欢使用 Fairphone 3,而且我的个人信仰与 Fairphone 的宣言一致,但我不会把注意力放在设备上,而只是放在 /e/ OS 上。

有评级隐私的应用程序

我把 Fairphone 3 作为我的日常使用设备用了几天时间,以比较与我的“普通”安卓手机在现实中的使用情况。

首先,我想看看我使用的所有应用程序是否都可以在 /e/ 基金会创建的“应用商店”上找到。/e/ 应用商店包含有隐私评级的应用程序。

/e/ OS 应用商店有应用程序的隐私评级

我可以找到许多应用程序,包括来自谷歌的应用程序。这意味着,如果有人真的想使用一些谷歌的服务,它仍然可以作为一个选项来下载。尽管与其他安卓设备不同,没有强行将谷歌服务塞进你的嘴里。

虽然有很多应用程序,但我无法找到我在英国使用的手机银行应用程序。我不得不承认,手机银行应用程序可以在一定程度上促进便利。作为替代方案,我不得不在需要时进入电脑使用网上银行平台。

从可用性的角度来看,/e/ OS 可以取代我的“标准”安卓操作系统,但会有一些小插曲,比如银行应用程序。

如果不是谷歌的,那是什么?

想知道 /e/ OS 使用哪些基本的应用程序,而不是谷歌的那些?这里有一个快速列表:

  • 魔法地球 —— 逐向道路导航
  • 浏览器 —— Chromium 的一个非谷歌复刻版本
  • 邮件 —— K9-mail 的一个复刻
  • 短信 —— QKSMS 的一个复刻
  • 照相机 —— OpenCamera 的一个复刻
  • 天气 —— GoodWeather 的一个复刻
  • OpenTasks —— 任务组织者
  • 日历:Etar calendar 的一个复刻

Bliss Launcher 和整体设计

/e/ OS 的默认启动程序被称为 “Bliss Launcher”,其目的是为了获得有吸引力的外观和感觉。对我来说,这个设计感觉与 iOS 相似。

通过向左滑动面板,你可以访问 /e/ 选择的一些有用的小工具。

  • 搜索:快速搜索预装的应用程序或搜索 Web
  • APP 建议:前 4 个最常用的应用程序将出现在这个小部件上
  • 天气:天气小部件显示的是当地的天气。它不会自动检测位置,需要进行配置。
  • 编辑:如果你想在屏幕上有更多的小部件,你可以通过点击“编辑”按钮添加它们。

总而言之,用户界面是干净整洁的简单明了,增强了愉快的用户体验。 * 天气。天气小部件显示的是当地的天气。它不会自动检测位置,需要进行配置。

  • 编辑:如果你想在屏幕上有更多的小部件,你可以通过点击编辑按钮添加它们。

总而言之,用户界面干净整洁、简单明了,增强了愉快的用户体验。

去谷歌化和面向隐私的操作系统

如前所述,/e/ 操作系统是一个去谷歌化的操作系统,它基于 Lineage OS 的开源核心。所有的谷歌应用程序已经被删除,谷歌服务已经被 MicroG 框架所取代。/e/ OS 仍然与所有的安卓应用兼容。

主要的隐私功能:

  • 谷歌搜索引擎已被 DuckDuckGo 等替代品取代
  • 谷歌服务已被 microG 框架所取代
  • 使用替代的默认应用程序,而不是谷歌应用程序
  • 取消了对谷歌服务器的连接检查
  • NTP 服务器已被替换为标准的 NTP 服务:pool.ntp.org
  • DNS 默认服务器由 9.9.9.9 取代,可以根据用户的选择进行编辑
  • 地理定位是在 GPS 的基础上使用 Mozilla 定位服务

隐私声明

请注意,使用由 /e/ 基金会提供的智能手机并不自动意味着无论你做什么都能保证你的隐私。分享你的个人信息的社交媒体应用程序应在你的意识下使用。

结论

我成为安卓用户已经超过十年了。/e/ OS 给我带来了积极的惊喜。关注隐私的用户可以发现这个解决方案非常吸引人,而且根据所选择的应用程序和设置,可以再次感觉到使用智能手机的安全。

如果你是一个有隐私意识的技术专家,并且能够自己找到解决问题的方法,我向你推荐它。对于那些习惯于谷歌主流服务的人来说,/e/ 生态系统可能会让他们不知所措。

你使用过 /e/ OS 吗?你的使用经验如何?你怎么看这些关注隐私的项目?


via: https://itsfoss.com/e-os-review/

作者:Dimitrios 选题:lujun9972 译者:wxy 校对:wxy

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

谷歌强调:Chrome“隐私沙盒”功能将不会为自己定制后门

Google 在周四的线上营销活动中声称,不会在「隐私沙盒」功能中为自家的业务定制单独的规则。

近年来隐私问题逐渐被大众所关注。无论是昨天报道的苹果的保护方式还是 Google 推出的隐私沙盒,都是希望让用户的隐私得到保护。但 Google 和苹果不同,Google 本身却是一个依赖广告盈利的公司,很难保证不给自己留后路。毕竟,2018 年 Google 就将 Don't be Evil 移出了自己的座右铭。

Chrome 浏览器将会有一定的性能提升,但可能没有什么用

在 Google 的 Chrome 浏览器中,将会加入一个新的名为 Sparkplug 的 JavScript 编译器,用以提升 Chrome 中的浏览性能。谷歌声称该编译器可以将性能提升 23%。

提升性能是一个好事情。不过,想想日新月异的前端领域,可能这个性格的提升很快就会被前端技术的提升而消磨掉。这难道就是新时代的「安迪 · 比尔定律」?

安迪·比尔定律:指新软件总将耗尽新硬件所提高的任何计算能力。

自由软件基金会寻求新的执行董事

自由软件基金会的现任董事 John Sullivan 在周五发推特声称自己即将离开自由软件基金会。自由软件基金会发布了文章向全网招募新的执行董事。值得注意的是,在其中的职位描述中写道,这个职位需要「指导、激励、协调和管理FSF的所有员工,营造一种坚持FSF思想原则(责任心、同理心、效率和卓越)的文化」

看起来像是为 RMS 提供的专属岗位。

B-tree 文件系统(Btrfs)融合了文件系统和卷管理器。它为 Linux 操作系统提供了高级文件系统应当拥有的诸多不错的功能特性。

 title=

好几年前 Btrfs 就已经可以在 Linux 中使用了,所以你可能已经熟悉它了。如果没有,你可能对它尚有疑虑,尤其是如果你使用的是 Fedora 工作站 (Btrfs 现在是它的默认文件系统)。本文旨在帮助你熟悉它及其高级功能,例如 写时复制校验和

Btrfs 是 “B-Tree Filesystem” 的缩写,实际上是文件系统和卷管理器的结合体。它通常被视为对 ZFS 的回应,ZFS 早在 2005 年就被引入 Sun 微系统的 Solaris 操作系统中,现在基本上被一个名为 OpenZFS 的开源实现所取代。Ubuntu 和 FreeBSD 常常使用 OpenZFS。其他具有类似特性的示例有红帽的 Stratis 和 Linux 逻辑卷管理器 Logical Volume Manager (LVM)。

安装

为了尝试 Btrfs,我下载了 Fedora 33 工作站 ISO 文件 并将其安装到一个新的虚拟机(VM)中。安装过程与以前的版本没有变化。我没有自定义任何设置,包括驱动器分区和格式化,以保持本教程的准确“开箱即用”设置。当虚拟机启动并运行后,我安装并运行了 GNOME 分区编辑器(GParted),以获得一个良好的、工厂级的驱动器布局视图。

 title=

从安装这一点来说,与你以前所习惯的情况没什么不同;事实上,你可以正常使用该系统,甚至可能没有注意到文件系统是 Btrfs。然而,拥有这个新的默认文件系统使你能够利用几个很酷的特性。

检查 Btrfs 文件系统

我暂时没有找到特定于 Btrfs 的图形工具,尽管它的一些功能已经被合并到现有的磁盘管理工具中。

在命令行中,你可以更仔细地查看 Btrfs 格式:

# btrfs filesystem show
Label: 'fedora_localhost-live'  uuid: f2bb02f9-5c41-4c91-8eae-827a801ee58a
        Total devices 1 FS bytes used 6.36GiB
        devid    1 size 10.41GiB used 8.02GiB path /dev/vda3

修改 Btrfs 标签

我首先注意到的是安装程序设置的文件系统标签:fedora_localhost-live。这是不准确的,因为它现在是一个已安装的系统,不再是 livecd。所以我使用 btrfs filesystem label 命令对其进行了更改。

修改 Btrfs 标签非常的简单:

# btrfs filesystem label /
fedora_localhost-live
# btrfs filesystem label / fedora33workstation
# btrfs filesystem label /
fedora33workstation

管理 Btrfs 子卷

子卷看起来像是可以由 Btrfs 管理的标准目录。我的新 Fedora 33 工作站上有几个子卷:

# btrfs subvolume list /
ID 256 gen 2458 top level 5 path home
ID 258 gen 2461 top level 5 path root
ID 265 gen 1593 top level 258 path var/lib/machines

使用 btrfs subvolume Create 命令创建新的子卷,或使用 btrfs subvolume delete 删除子卷:

# btrfs subvolume create /opt/foo
Create subvolume '/opt/foo'
# btrfs subvolume list /
ID 256 gen 2884 top level 5 path home
ID 258 gen 2888 top level 5 path root
ID 265 gen 1593 top level 258 path var/lib/machines
ID 276 gen 2888 top level 258 path opt/foo
# btrfs subvolume delete /opt/foo
Delete subvolume (no-commit): '/opt/foo'

子卷允许设置配额、拍摄快照以及复制到其他位置和其他主机等操作。那么系统管理员如何利用这些功能?用户主目录又是如何操作的呢?

添加用户

就像从前一样,添加一个新的用户帐户会创建一个主目录供该帐户使用:

# useradd student1
# getent passwd student1
student1:x:1006:1006::/home/student1:/bin/bash
# ls -l /home
drwx------. 1 student1 student1  80 Oct 29 00:21 student1

传统上,用户的主目录是 /home 的子目录。所有权和操作权是为所有者量身定制的,但是特殊功能来没有管理它们。而企业服务器环境是另外一种情况。通常,目录是为特定的应用程序及其用户保留的。你可以利用 Btrfs 来管理和应用对这些目录的约束。

为了将 Btrfs 子卷作为用户主页,在 useradd 命令中有一个新选项:--Btrfs-subvolume-home。尽管手册页尚未更新(截至本文撰写之时),但你可以通过运行 useradd --help 来查看该选项。通过在添加新用户时传递此选项,将创建一个新的 Btrfs 子卷。它的功能与创建常规目录时的 -d 选项类似:

# useradd --btrfs-subvolume-home student2
Create subvolume '/home/student2'

使用 getent passwd student2 验证用户,它将显示为正常。但是,运行 btrfs subvolume 命令列出子卷,你将看到一些有趣的内容:新用户的主目录!

# btrfs subvolume list /
ID 256 gen 2458 top level 5 path home
ID 258 gen 2461 top level 5 path root
ID 265 gen 1593 top level 258 path var/lib/machines
ID 272 gen 2459 top level 256 path home/student2

探索企业服务器环境的第二个场景。假设你需要在 /opt 中安装一个 WildFly 服务器并部署一个 Java web 应用程序。通常,你的第一步是创建一个 wildfly 用户。使用新的 --btrfs-subvolume-home 选项和 -b 选项来指定 /opt 作为基本目录:

# useradd -b /opt --btrfs-subvolume-home wildfly
Create subvolume '/opt/wildfly'

于是,wildfly 用户可以使用了,并且主目录设置在了 /opt/wildfly

删除用户

删除用户时,有时需要同时删除该用户的文件和主目录。userdel 命令有 -r 选项,它可以同时删除 Btrfs 子卷:

# userdel -r student2
Delete subvolume (commit): '/home/student2'

设置磁盘使用配额

在我的一节计算机科学课上,一个学生运行了一个失控的 C 程序,然后写进了磁盘,将我们院的 Unix 系统上整个 /home 目录都填满了!在管理员终止失控进程并清除一些空间之前,服务器将无法使用。上述情况也是如此;那个 Wildfly 企业应用程序将为其用户提供越来越多的日志文件和内容存储。如何防止服务器因磁盘已满而死机?设置磁盘使用限制是个好主意。幸运的是,Btrfs 通过设置配额的方式支持这一点。

配置配额需要几个步骤。第一步是在 Btrfs 文件系统上启用配额:

# btrfs quota enable /

确保你知道每个子卷的配额组(qgroup)ID 号,该编号由 btrfs subvolume list 命令显示。每个子卷都需要基于 ID 号码来关联配额组。这可以通过 btrfs qgroup create 单独完成,但是,btrfs 维基提供了以下命令来加快为文件系统上的子卷创建配额组:

> btrfs subvolume list \<path> | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup destroy 0/{} \<path>

在新安装的 Fedora 33 工作站系统中,你在根文件系统路径上操作,/。用根路径替换 \<path>

# btrfs subvolume list / | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup create 0/{} /

然后运行 btrfs quota rescan,查看新的配额组:

# btrfs quota rescan /
quota rescan started
# btrfs qgroup show /
qgroupid         rfer         excl
--------         ----         ----
0/5          16.00KiB     16.00KiB
0/256       272.04MiB    272.04MiB
0/258         6.08GiB      6.08GiB
0/265        16.00KiB     16.00KiB
0/271        16.00KiB     16.00KiB
0/273        16.00KiB     16.00KiB

于是现在,你可以将配额分配给其中一个配额组,然后将配额应用于其关联的子卷。因此,如果要将 student3 的主目录使用限制为 1 GB,请使用 btrfs qgroup limit 命令:

# btrfs qgroup limit 1G /home/student3

查看特定子卷的配额:

# btrfs qgroup show -reF /home/student3
qgroupid         rfer         excl     max_rfer     max_excl
--------         ----         ----     --------     --------
0/271        16.00KiB     16.00KiB      1.00GiB         none

稍有不同的选项参数将显示所有配额组和设置的所有配额:

# btrfs qgroup show -re /
qgroupid         rfer         excl     max_rfer     max_excl
--------         ----         ----     --------     --------
0/5          16.00KiB     16.00KiB         none         none
0/256       272.04MiB    272.04MiB         none         none
0/258         6.08GiB      6.08GiB         none         none
0/265        16.00KiB     16.00KiB         none         none
0/271        16.00KiB     16.00KiB      1.00GiB         none
0/273        16.00KiB     16.00KiB         none         none

其他特性

这些例子提供了 Btrfs 特性的一些思考。运行 btrfs --help 查看命令的完整列表。还有许多其他值得注意的功能;例如,快照和发送/接收是两个值得学习的功能。

总结讨论

Btrfs 为向 Linux 提供高级文件系统特性集贡献了很多特性。这不是第一次;我知道 ZFS 在大约 15 年前引入了这种类型的文件系统,但是 Btrfs 是完全开源的,不受专利的限制。

如果你想探索这个文件系统,我建议从虚拟机或备用系统开始。

我想能够出现一些图形化的管理工具,为那些喜欢用图形工具的系统管理员提供便利。幸运的是,Btrfs 具有强大的开发活动,Fedora 33 项目决定将其设置为工作站上的默认值就证明了这一点。


via: https://opensource.com/article/20/11/btrfs-linux

作者:Alan Formy-Duval 选题:lujun9972 译者:Chao-zhi 校对:wxy

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

探索异常处理和其他未被充分利用但仍然有用的 Python 特性。

 title=

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

yield from

yield 关键字使 Python 更加强大。可以预见的是,人们都开始使用它来创建整个迭代器的生态系统。itertools 模块和 more-itertools PyPI 包就是其中两个例子。

有时,一个新的生成器会想要使用一个现有的生成器。作为一个简单的(尽管有点故意设计)的例子,设想你想枚举所有的自然数对。

一种方法是按照“自然数对的和,自然数对的第一项”的顺序生成所有的自然数对。用 yield from 来实现这个方法是很自然的。

yield from <x> 关键字是以下的简称:

for item in x:
    yield item
import itertools

def pairs():
    for n in itertools.count():
        yield from ((i, n-i) for i in range(n+1))
list(itertools.islice(pairs(), 6))
    [(0, 0), (0, 1), (1, 0), (0, 2), (1, 1), (2, 0)]

隐式命名空间包

假设有一个叫 Parasol 的虚构公司,它制造了一堆东西。它的大部分内部软件都是用 Python 编写的。虽然 Parasol 已经开源了它的一些代码,但其中一些代码对于开源来说过于专有或专业。

该公司使用内部 DevPI 服务器来管理内部软件包。对于 Parasol 的每个 Python 程序员来说,在 PyPI 上找一个未使用的名字是没有意义的,所以所有的内部包都被称为 parasol.<business division>.<project>。遵守最佳实践,开发人员希望包的名字能反映出这个命名系统。

这一点很重要!如果 parasol.accounting.numeric_tricks 包安装了一个名为 numeric_tricks 的顶层模块,这意味着依赖这个包的人将无法使用名为 numeric_tricks 的 PyPI 包,不管它写的有多好。

然而,这给开发者留下了一个两难的选择:哪个包拥有 parasol/__init__.py 文件?从 Python 3.3 开始,最好的解决办法是把 parasol,可能还有 parasol.accounting,变成没有 __init__.py 文件的 命名空间包

抑制异常的上下文

有时,在从异常中恢复的过程中出现的异常是一个问题,有上下文来跟踪它是很有用的。然而,有时却不是这样:异常已经被处理了,而新的情况是一个不同的错误状况。

例如,想象一下,在字典中查找一个键失败后,如果不能分析它,则希望失败并返回 ValueError()

import time

def expensive_analysis(data):
    time.sleep(10)
    if data[0:1] == ">":
        return data[1:]
    return None

这个函数需要很长的时间,所以当你使用它时,想要对结果进行缓存:

cache = {}

def last_letter_analyzed(data):
    try:
        analyzed = cache[data]
    except KeyError:
        analyzed = expensive_analysis(data)
        if analyzed is None:
            raise ValueError("invalid data", data)
        cached[data] = analyzed
    return analyzed[-1]

不幸的是,当出现缓存没有命中时,回溯看起来很难看:

last_letter_analyzed("stuff")
    ---------------------------------------------------------------------------

    KeyError                                  Traceback (most recent call last)

    <ipython-input-16-a525ae35267b> in last_letter_analyzed(data)
          4     try:
    ----> 5         analyzed = cache[data]
          6     except KeyError:


    KeyError: 'stuff'

在处理上述异常的过程中,发生了另一个异常:

    ValueError                                Traceback (most recent call last)

    <ipython-input-17-40dab921f9a9> in <module>
    ----> 1 last_letter_analyzed("stuff")
   

    <ipython-input-16-a525ae35267b> in last_letter_analyzed(data)
          7         analyzed = expensive_analysis(data)
          8         if analyzed is None:
    ----> 9             raise ValueError("invalid data", data)
         10         cached[data] = analyzed
         11     return analyzed[-1]


    ValueError: ('invalid data', 'stuff')

如果你使用 raise ... from None,你可以得到更多可读的回溯:

def last_letter_analyzed(data):
    try:
        analyzed = cache[data]
    except KeyError:
        analyzed = expensive_analysis(data)
        if analyzed is None:
            raise ValueError("invalid data", data) from None
        cached[data] = analyzed
    return analyzed[-1]
last_letter_analyzed("stuff")
    ---------------------------------------------------------------------------

    ValueError                                Traceback (most recent call last)

    <ipython-input-21-40dab921f9a9> in <module>
    ----> 1 last_letter_analyzed("stuff")
   

    <ipython-input-20-5691e33edfbc> in last_letter_analyzed(data)
          5         analyzed = expensive_analysis(data)
          6         if analyzed is None:
    ----> 7             raise ValueError("invalid data", data) from None
          8         cached[data] = analyzed
          9     return analyzed[-1]


    ValueError: ('invalid data', 'stuff')

欢迎来到 2012 年

尽管 Python 3.3 在十年前就已经发布了,但它的许多功能仍然很酷,而且没有得到充分利用。如果你还没有,就把它们添加到你的工具箱中吧。


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

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

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