问题标签 [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.
python - Python 属性中允许特殊字符的原因
我有点意外地发现,您可以使用setattr
. 非法,我的意思是属性名称无法使用__getattr__
具有传统.
运算符引用的接口检索。它们只能通过该getattr
方法检索。
对我来说,这似乎相当令人惊讶,我想知道这是否有原因,或者是否只是被忽略了等等。由于存在用于检索属性的运算符和setattribute
接口的标准实现,我希望它只允许实际上可以正常检索的属性名称。而且,如果您有一些奇怪的理由想要具有无效名称的属性,则必须为它们实现自己的接口。
只有我对这种行为感到惊讶吗?
这会返回一些既奇怪又有点误导的东西:
[...'__weakref__', 'bar.baz']
如果我想以“标准”方式访问 foo.bar.baz,我不能。无法检索它是完全合理的,但设置它的能力令人惊讶。
是否只是假设,如果您必须使用setattr
来设置变量,您将通过 引用它getattr
?因为在运行时,这可能并不总是正确的,尤其是对于 Python 的交互式解释器、反射等。默认情况下允许这样做似乎仍然很奇怪。
编辑:我希望看到的setattr默认实现的(非常粗略的)示例:
这将不允许我在属性名称中使用无效字符。显然,super()
不能在基 Object 类上使用,但这只是一个示例。
r - 当 data.frame 中的列数可以减少到一时,防止转换为因子
我有一个程序可以根据列上的条件列表从数据框中提取项目(请参阅使用 (column_name = value) 列表给出的条件从 R 数据框中提取项目):
以下是数据框和条件列表:
我的目标是提取与lib
列表中给出的标准相对应的行的列中的值。
我可以使用以下函数来提取想要的值:
这适用于上述数据框:
但是,我希望这个更笼统:我的experimental_plan
和condition
可以有不同的列:
这次失败了:
在这种情况下,预期的输出应该是:
如何编写一个以更健壮的方式执行相同操作的函数?
评论
尽管两种情况非常相似,但我发现该函数不起作用,这让我感到非常沮丧:两个数据框都有一个lib
列,并且在这两种情况下,条件列表中的名称都对应于数据框中的列名。
当从数据框中提取的列数减少到一时,R 显然会自动将 data.frame 转换为因子:
这违背了最小意外原则。当给定相同类型的输入时,我希望计算返回相同类型的输出。
python - python函数中的可变与不可变对象行为
下面的两段代码产生不同的输出。
输出是:
对于第二个功能:
输出是:
现在我知道这是因为“1”是 int 类型并且是不可变的(就像我使用元组一样)。我试图理解的是这个逻辑是如何工作的。在这两个函数的开头,您位于各自函数的命名空间中,并且 x 有一个分配给它的对象。为什么只有在第二种情况下才被重新分配为“0”?谢谢。
c# - 具有默认值的对象初始值设定项内的集合初始值设定项
我刚刚偶然发现了以下问题:
我理解为什么会发生这种情况: AllowedIds = { 1, 2 }
不是赋值,而是对象初始值设定项中的集合初始值设定项,即,它是对AllowedIds.Add(1); AllowedIds.Add(2)
.
尽管如此,对我来说这是一个陷阱,因为它看起来像一个作业(因为它使用=
)。
作为一名 API/库开发人员(假设我是开发Settings
该类的人),想要坚持最小意外原则,我能做些什么来防止我的库的使用者落入这个陷阱吗?
脚注:
在那种特殊情况下,我可以使用 an
ISet/HashSet<int>
而不是ICollection/List
(因为重复对 没有意义AllowedIds
),这将产生1, 2
. 尽管如此,初始化AllowedIds = { 2 }
会产生反直觉的结果1, 2
。我在C# github repo上找到了一个相关的讨论,基本上得出的结论是,是的,这种语法令人困惑,但它是一个旧功能(2006 年引入),我们无法在不破坏向后兼容性的情况下更改它。
c++ - 使 ++o++ 抱怨具有用户定义的前置和后缀增量运算符的类型
我正在寻找一种方法来防止++x++
使用用户定义的前缀和后缀增量运算符的类型。
对于内置类型,后缀运算符的结果类型不是左值而是纯右值表达式,编译器抱怨得很好。
我能想到的最简单的事情是为后缀增量运算符返回 const:
这种方法有缺陷吗?
编辑:
多亏了答案,我在这里、这里以及当然在cppreference上找到了更多信息。