def decorated(f):
@functools.wraps(f)
def wrapper():
return f()
return wrapper
@decorated
def g():
pass
Run Code Online (Sandbox Code Playgroud)
functools.wraps它的工作是保留以下名称g:
>>> g.__name__
'g'
Run Code Online (Sandbox Code Playgroud)
但是如果我传递一个参数g,我得到一个TypeError包含包装器的名称:
>>> g(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: wrapper() takes no arguments (1 given)
Run Code Online (Sandbox Code Playgroud)
这个名字来自哪里?它保存在哪里?有没有办法使异常看起来像g() takes no arguments?
在OCaml中,我有两种定义类型的模块类型t:
module type Asig = sig
type t
val a : t
end
module type Bsig = sig
type t
val b : t
end
Run Code Online (Sandbox Code Playgroud)
我想自动创建合并它们的模块类型.我想创建一个等效于的模块类型:
module type ABsig_manual = sig
type t
val a : t
val b : t
end
Run Code Online (Sandbox Code Playgroud)
我试过了
module type ABsig = sig
include Asig
include Bsig
end
Run Code Online (Sandbox Code Playgroud)
但这失败了Error: Multiple definition of the type name t.似乎不可能添加类型约束,include所以我被卡住了.
上下文:我有一个AB实现两个签名的模块,我想将它提供给一个仿函数,如:
module MakeC(AB) = struct
type t = AB.t list
let …Run Code Online (Sandbox Code Playgroud) 下面的代码编译(使用nvcc test.cu -o test)并运行没有错误,这意味着它std::sin()在设备上工作:
#include <cmath>
#include <vector>
#include <cassert>
#include <numeric>
__global__ void map_sin(double* in, double* out, int n) {
const int i = blockIdx.x * 512 + threadIdx.x;
if (i < n) {
out[i] = std::sin(in[i]);
}
}
int main() {
const int n = 1024;
std::vector<double> in(n), out(n);
std::iota(in.begin(), in.end(), 1.);
double *in_, *out_;
cudaMalloc(reinterpret_cast<void**>(&in_), n * sizeof(double));
cudaMemcpy(in_, in.data(), n * sizeof(double), cudaMemcpyHostToDevice);
cudaMalloc(reinterpret_cast<void**>(&out_), n * sizeof(double));
map_sin<<<n / 512, 512>>>(in_, out_, …Run Code Online (Sandbox Code Playgroud)