我的问题来自这个问题,其中用户在不知不觉中重新绑定了内置的 global set. 当您尝试覆盖内置函数时,是否有一种直接的方法可以让 python 警告您?
我正在考虑更具体的 Mathematica。在 Mathematica 中,所有内置函数都有属性Protected. 如果您尝试重新定义Set,它会告诉您Set是这样Protected并保持不变,这可能会使您在以后应该工作的事情没有明显原因停止这样做时避免大量混乱。如果你真的很想重新定义Set你仍然可以做到——你只需Unprotect要先去做。您也可以使用Protect自己的符号来保护它们免受意外重新定义。
也许有经验的pythoners不需要这个,但是如果像我这样的新手有这样的东西就好了。(想想看,我已经为 Mathematica 编程了 15 年,Protected但仍然偶尔会保存我的培根。)
我一直在思考这两个函数的返回值。__sync_bool_compare_and_swap 函数的返回值似乎有明显的好处,即我可以用它来判断是否发生了交换操作。但是我看不到 __sync_val_compare_and_swap 的返回值的良好使用。
首先,让我们有一个函数签名供参考(来自 GCC 文档减去 var args):
type __sync_val_compare_and_swap (type *ptr, type oldval type newval);
Run Code Online (Sandbox Code Playgroud)
我看到的问题是 __sync_val_compare_and_swap 的返回值是 *ptr 的旧值。准确地说,它是在适当的内存屏障到位后通过此函数的实现看到的值。我明确指出这是为了满足这样一个事实,即在调用 __sync_val_compare_and_swap 和执行指令以强制执行内存屏障之间,*ptr 的值很容易改变。
现在,当函数返回时,我可以用那个返回值做什么?尝试将其与 *ptr 进行比较是没有意义的,因为现在可以在其他线程上更改 *ptr。同样,比较 newval 和 *ptr 也对我没有真正的帮助(除非我锁定 *ptr 这可能首先会破坏我对原子的使用)。
所以真正留给我做的就是询问是否返回值 == oldval,这实际上是(请参阅下面的警告)询问是否发生了交换操作。所以我可以只使用 __sync_bool_compare_and_swap。
我刚刚提到的警告是,我在这里看到的唯一细微差别是,这样做并没有告诉我交换是否发生,它只是告诉我在释放内存屏障之前的某个时刻 *ptr 具有相同的值为 newval。我正在考虑 oldval == newval 的可能性(尽管我很难找到一种有效实现该函数的方法,以便它可以首先检查这些值而不是交换它们是否相同,所以这可能是一个有争议的问题)。但是,我看不到在呼叫站点知道这种差异会对我产生影响的情况。事实上,我无法想象我会将 oldval 和 newval 设置为相等的情况。
我的问题是:
是否存在使用 __sync_val_compare_and_swap 和 __sync_bool_compare_and_swap 不等效的用例,即是否存在一种情况提供的信息多于另一个的情况?
在旁边
我考虑这个的原因是我发现了一个 __sync_val_compare_and_swap 的实现,它有一个竞争:
inline int32_t __sync_val_compare_and_swap(volatile int32_t* ptr, int32_t oldval, int32_t newval)
{
int32_t ret = *ptr;
(void)__sync_bool_compare_and_swap(ptr, oldval, newval);
return ret; …Run Code Online (Sandbox Code Playgroud) python(内置函数或其他东西)有什么方法可以检查函数执行是否由于错误或工作而失败?并根据情况返回 true 或 false
我期望发生的情况的示例:
内置方法示例:iserror
iserror(float('123')) #returns False, as no error on float('123') occurs
iserror(float('as1f')) #returns True, as it is not possible to convert to float the string ('as1f')
Run Code Online (Sandbox Code Playgroud) 是否可以为 Python 3 中的内置类重载运算符?具体来说,我想重载+/ +=(即:__add__类的运算符str,以便我可以执行诸如"This is a " + class(bla).
我需要知道 gcc 是否有一种方法可以检查那些真棒的存在 __builtin_MY_DESIRED_FUNCTIONs
例如,我想使用__builtin_nan并确保它可用于我的程序,并且在编译期间不会失败。
我会更具体:在clang上有__has_builtin“检查器”所以我们可以像这样写
#if __has_builtin(__builtin_nan)
Run Code Online (Sandbox Code Playgroud)
但我找不到 gcc 的模拟。
也许我可以只依赖 gcc,比如“哦,我现在在 gcc 上,让我们假设所有这些__builtin_都在这里,就像下面的例子一样......”
#if __GNUC__
double mynan = __builtin_nan("0");
#endif
Run Code Online (Sandbox Code Playgroud)
并且可能它会起作用,直到有人放置这个“-fno-builtin”编译标志。
最近,我发现void __builtin_assume(bool)了 clang,它可以向编译器提供有关程序状态的附加信息。这可以产生巨大的差异,例如:
#include <cstddef>
// compiles to about 80 instructions at -O3
unsigned sum(unsigned data[], size_t count) {
unsigned sum = 0;
for (size_t i = 0; i < count; ++i) {
sum += data[i];
}
return sum;
}
// compiles to about 10 instructions at -O3
unsigned sum_small(unsigned data[], size_t count) {
__builtin_assume(count <= 4);
unsigned sum = 0;
for (size_t i = 0; i < count; ++i) {
sum += data[i];
}
return …Run Code Online (Sandbox Code Playgroud) 我从Python过渡到Go 时遇到了一些困难,而且我历来依赖内置实用程序函数(例如Python的dir )来列出底层方法和属性。
go中有等效的吗?
我正在使用Octave在同一个图中绘制子图,并且想要添加一般标题,是否有像Matlabsgtitle中那样的内置函数,因为 这个老问题
有一个解决方案,但没有使用任何很酷的内置函数,而 Octave 没有。也在这里Octave - Bugs:bug #55019,我发现Octave 中有新的 sgtitle 函数,但找不到文档或包名称或任何东西......它是否尚未完全实现或有其他替代方案???sgtitle
我问的是 package 或 bultin 函数而不是实现,我将从某人那里编写或复制
如果有这样的代码:
class Foo():
def open(self, bar):
# Doing some fancy stuff here, i.e. opening "bar"
pass
Run Code Online (Sandbox Code Playgroud)
当我flake8使用flake8-builtins插件运行时,出现错误
A003 class attribute "open" is shadowing a python builtin
Run Code Online (Sandbox Code Playgroud)
我不明白该方法如何可能隐藏内置 open函数,因为该方法只能使用实例(即self.open("")或someFoo.open(""))来调用。是否有其他方式希望调用内置函数的代码最终调用该方法?flake8-builtins或者这是插件的误报?
我正在寻找一种优雅的方法来检查给定索引是否位于 numpy 数组内(例如网格上的 BFS 算法)。
下面的代码实现了我想要的功能:
import numpy as np
def isValid(np_shape: tuple, index: tuple):
if min(index) < 0:
return False
for ind,sh in zip(index,np_shape):
if ind >= sh:
return False
return True
arr = np.zeros((3,5))
print(isValid(arr.shape,(0,0))) # True
print(isValid(arr.shape,(2,4))) # True
print(isValid(arr.shape,(4,4))) # False
Run Code Online (Sandbox Code Playgroud)
但我更喜欢内置的或更优雅的东西,而不是编写自己的函数,包括 python for 循环(yikes)