小编err*_*ynn的帖子

错误包装/展开&&使用errors.Is()进行类型检查

我正在检查 Go v1.13 Go v1.14 中的错误跟踪。为什么看起来只能找到不带参数或带值接收器的错误实现errors.Is()?这意味着能够包装的错误实现必须有一个值接收器,以便能够通过 找到errors.Is()

package main

import (
    "fmt"
    "errors"
)

type someAtomicError struct {}
func (e *someAtomicError) Error() string { return "Hi!" }
func checkAtomicError() {
    e := &someAtomicError{}
    e2 := fmt.Errorf("whoa!: %w", e)
    e2IsE := errors.Is(e2, &someAtomicError{})
    fmt.Println("atomic error trace ---\t\t", e2, "\t\t--- is traceable: ", e2IsE)
}


type someWrapperError struct {
    Msg string
    Err error
}
func (e someWrapperError) Error() string { return fmt.Sprintf("%s: %v", e.Msg, e.Err) }
func (e …
Run Code Online (Sandbox Code Playgroud)

error-handling trace wrapper go

10
推荐指数
2
解决办法
2万
查看次数

if语句范围内的C++宏未编译

我有一些代码应该是一个线程安全的python/c ++ api.我现在用的是宏Py_BEGIN_ALLOW_THREADSPy_END_ALLOW_THREADS,其扩展到创建节约线程状态,并创建一个锁.我在方法退出之前释放锁; 一旦在if语句范围内,一旦在方法范围内.

为什么这不编译?它会生成错误:error: _save was not declared in this scope在第二个Py_END_ALLOW_THREADS宏.

uint8_t SerialBuffer::push_msg() {

#if defined (UBUNTU)
  Py_BEGIN_ALLOW_THREADS
#endif

  if (_type == ARRAY) {
      // array access
  } else if (_type == PRIORITY_QUEUE) {
      // queue access
  } else {

    // Placing the return statement in the preprocessor directive
    // has no effect.
#if defined (UBUNTU)
    Py_END_ALLOW_THREADS
#endif

    return FAIL;
  }

#if defined (UBUNTU)
  Py_END_ALLOW_THREADS
#endif

  return SUCCESS;
} …
Run Code Online (Sandbox Code Playgroud)

c++ python macros multithreading c-preprocessor

5
推荐指数
1
解决办法
291
查看次数

列出Python函数定义中的构建

我想建立一个原型:

def foo(a,t=([0]*len(a))):
  print t
Run Code Online (Sandbox Code Playgroud)

由于目前不重要的原因.我传入的是可变长度列表参数.但是,Linux上的Python 2.7.10总是返回如下:

>>> a = [1,2,3,4]
>>> foo(a)
[O, 0]
Run Code Online (Sandbox Code Playgroud)

没有函数调用,这些都不会以意外的方式运行.是什么导致Python总是认为在foo()中的变量赋值期间传递的列表是长度为2?

python kwargs function-declaration python-2.7

3
推荐指数
1
解决办法
51
查看次数