问题标签 [least-astonishment]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1976 浏览

python - Python 属性中允许特殊字符的原因

我有点意外地发现,您可以使用setattr. 非法,我的意思是属性名称无法使用__getattr__具有传统.运算符引用的接口检索。它们只能通过该getattr方法检索。

对我来说,这似乎相当令人惊讶,我想知道这是否有原因,或者是否只是被忽略了等等。由于存在用于检索属性的运算符和setattribute接口的标准实现,我希望它只允许实际上可以正常检索的属性名称。而且,如果您有一些奇怪的理由想要具有无效名称的属性,则必须为它们实现自己的接口。

只有我对这种行为感到惊讶吗?

这会返回一些既奇怪又有点误导的东西: [...'__weakref__', 'bar.baz']

如果我想以“标准”方式访问 foo.bar.baz,我不能。无法检索它是完全合理的,但设置它的能力令人惊讶。

是否只是假设,如果您必须使用setattr来设置变量,您将通过 引用它getattr?因为在运行时,这可能并不总是正确的,尤其是对于 Python 的交互式解释器、反射等。默认情况下允许这样做似乎仍然很奇怪。

编辑:我希望看到的setattr默认实现的(非常粗略的)示例:

这将不允许我在属性名称中使用无效字符。显然,super()不能在基 Object 类上使用,但这只是一个示例。

0 投票
0 回答
88 浏览

r - 当 data.frame 中的列数可以减少到一时,防止转换为因子

我有一个程序可以根据列上的条件列表从数据框中提取项目(请参阅使用 (column_name = value) 列表给出的条件从 R 数据框中提取项目):

以下是数据框和条件列表:

我的目标是提取与lib列表中给出的标准相对应的行的列中的值。

我可以使用以下函数来提取想要的值:

这适用于上述数据框:

但是,我希望这个更笼统:我的experimental_plancondition可以有不同的列:

这次失败了:

在这种情况下,预期的输出应该是:

如何编写一个以更健壮的方式执行相同操作的函数?


评论

尽管两种情况非常相似,但我发现该函数不起作用,这让我感到非常沮丧:两个数据框都有一个lib列,并且在这两种情况下,条件列表中的名称都对应于数据框中的列名。

当从数据框中提取的列数减少到一时,R 显然会自动将 data.frame 转换为因子:

这违背了最小意外原则。当给定相同类型的输入时,我希望计算返回相同类型的输出。

0 投票
0 回答
32 浏览

python - python函数中的可变与不可变对象行为

下面的两段代码产生不同的输出。

输出是:

对于第二个功能:

输出是:

现在我知道这是因为“1”是 int 类型并且是不可变的(就像我使用元组一样)。我试图理解的是这个逻辑是如何工作的。在这两个函数的开头,您位于各自函数的命名空间中,并且 x 有一个分配给它的对象。为什么只有在第二种情况下才被重新分配为“0”?谢谢。

0 投票
1 回答
112 浏览

c# - 具有默认值的对象初始值设定项内的集合初始值设定项

我刚刚偶然发现了以下问题:

我理解为什么会发生这种情况: AllowedIds = { 1, 2 }不是赋值,而是对象初始值设定项中的集合初始值设定项,即,它是对AllowedIds.Add(1); AllowedIds.Add(2).

尽管如此,对我来说这是一个陷阱,因为它看起来像一个作业(因为它使用=)。

作为一名 API/库开发人员(假设我是开发Settings该类的人),想要坚持最小意外原则,能做些什么来防止我的库的使用者落入这个陷阱吗?


脚注:

  • 在那种特殊情况下,我可以使用 anISet/HashSet<int>而不是ICollection/List(因为重复对 没有意义AllowedIds),这将产生1, 2. 尽管如此,初始化AllowedIds = { 2 }会产生反直觉的结果1, 2

  • 我在C# github repo上找到了一个相关的讨论,基本上得出的结论是,是的,这种语法令人困惑,但它是一个旧功能(2006 年引入),我们无法在不破坏向后兼容性的情况下更改它。

0 投票
2 回答
62 浏览

c++ - 使 ++o++ 抱怨具有用户定义的前置和后缀增量运算符的类型

我正在寻找一种方法来防止++x++使用用户定义的前缀和后缀增量运算符的类型。

对于内置类型,后缀运算符的结果类型不是左值而是纯右值表达式,编译器抱怨得很好。

我能想到的最简单的事情是为后缀增量运算符返回 const:

这是一个神螺栓

这种方法有缺陷吗?

编辑:

多亏了答案,我在这里这里以及当然在cppreference上找到了更多信息。