小编zwo*_*wol的帖子

包的相对导入__init__.py

假设我有一个包含两个子模块的包,并且__init__.py本身也包含大量代码:

pkg/__init__.py
pkg/foo.py
pkg/bar.py
Run Code Online (Sandbox Code Playgroud)

并且,为了使计划的未来重构更容易,我希望包的组件专门使用相对导入来相互引用.特别是,import pkg永远不应该出现.

foo.py我能做到

from __future__ import absolute_import
from . import bar
Run Code Online (Sandbox Code Playgroud)

访问bar.py模块,反之亦然.

问题是,我以__init__.py这种方式写什么来导入? 我想要完全相同的效果import pkg as local_name,只需要不必指定绝对名称pkg.

#import pkg as local_name
from . import ??? as local_name
Run Code Online (Sandbox Code Playgroud)

更新:受到maxymoo的回答的启发,我试过了

from . import __init__ as local_name
Run Code Online (Sandbox Code Playgroud)

这不会设置local_name为定义的模块__init__.py; 它取而代之的是看起来是该模块__init__ 方法的绑定方法包装器.我想我能做到

from . import __init__ as local_name
local_name = local_name.__self__
Run Code Online (Sandbox Code Playgroud)

得到我想要的东西,但(a)哎呀,(b)这让我担心模块还没有完全初始化.

答案需要在工作的Python 2.7和Python 3.4+.

是的,挖空可能会更好__init__.py …

python packages python-module

13
推荐指数
1
解决办法
1839
查看次数

使用stddef.h的offsetof而不是滚动自己的可移植性

这是一个挑剔的细节问题,有三个部分.上下文是我希望说服一些人无条件地使用无条件<stddef.h>的定义offsetof而不是(在某些情况下)滚动他们自己的定义是安全的.有问题的程序完全用普通的旧C编写,所以在回答时请完全忽略C++.

第1部分:当以与标准相同的方式使用时offsetof,此宏的扩展是否会引发每个C89的未定义行为,为什么或为什么不行,并且它在C99中是不同的?

#define offset_of(tp, member) (((char*) &((tp*)0)->member) - (char*)0)
Run Code Online (Sandbox Code Playgroud)

注意:人们感兴趣的所有实现都取代了标准的规则,指针只有在指向同一个数组时才能相互减去,通过定义所有指针,无论类型或值,指向单个指针全球地址空间.因此,在争论这个宏的扩张引发未定义的行为时,请不要依赖于该规则.

第2部分:据您所知,有没有一个已发布的生产C实现,当进行上述宏的扩展时,(在某些情况下)会表现出与offsetof使用其宏时的情况不同的行为?

第3部分:据您所知,最近发布的生产C实现是什么,或者未提供stddef.h或未提供offsetof该标题中的工作定义?该实现是否声称符合任何版本的C标准?

对于第2部分和第3部分,请仅在您可以命名特定实现并给出发布日期时回答.说明可能符合条件的实现的一般特征的答案对我没用.

c standards portability

12
推荐指数
2
解决办法
3027
查看次数

如何在smb:// URL的密码字段中转义@符号

我正在尝试编写一个bash脚本,我在其中连接到samba服务器,获取用户名和密码,然后说$ username:$ password @ SERVERNAME.

但是,如果密码中包含@,则会失败.有没有办法逃脱bash中的@ out密码?

提前致谢

更新:我正在设置此网络打印机

lpadmin -p PRINTER -v smb://$username:$password@SERVER -E
Run Code Online (Sandbox Code Playgroud)

除了$ password中有@符号的情况外,它有效; $ username和$ passwords变量来自读取标准输入

bash samba escaping

11
推荐指数
1
解决办法
1万
查看次数

Cython:在一个结构中嵌入一个联合

在Cython glue声明中,我如何表示struct包含匿名联合的C 类型?例如,如果我有一个C头文件mystruct.h包含

struct mystruct
{
    union {
        double da;
        uint64_t ia;
    };
};
Run Code Online (Sandbox Code Playgroud)

然后,在相应的.pyd文件中

cdef extern from "mystruct.h":
    struct mystruct:
        # what goes here???
Run Code Online (Sandbox Code Playgroud)

我试过这个:

cdef extern from "mystruct.h":
    struct mystruct:
        union {double da; uint64_t ia;};
Run Code Online (Sandbox Code Playgroud)

但这只给了我"C变量声明中的语法错误"就union行了.

c python struct cython unions

11
推荐指数
2
解决办法
2001
查看次数

Rails"act-as-taggable-on":如何将tag*objects*添加到taggables,而不是名称

在数据导入器中,我有一些代码试图将一堆ActsAsTaggableOn::Tag 对象添加到可标记的标记列表中:

    existing_item = FeedItem.where(url: item[:url]).first

    if existing_item.nil?
      new_item = FeedItem.new

      new_item.attributes = item.except(:id, :feeds)

      new_item.feeds = Feed.where(id: feeds_old_to_new(item_feeds, feeds))
      new_item.tag_list.add(
          ActsAsTaggableOn::Tag.where(id: tags_old_to_new(item[:tags], tags)))

      new_item.save!
   else
      # ... merge imported record with existing item ...
   end
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为tag_list.add它采用标记名称列表,而不是标记对象.有没有办法添加标签对象?我在act-as-taggable-on文档中找不到任何内容,而且它的代码对我来说太难理解了(例如,Tag::concat似乎没有变异自我!)

我可以将标签映射到它们的名称,但是,act-as-taggable-on会运行适合用户输入的名称规范化,但不适用于批量数据导入,所以我不想这样做.

ruby-on-rails acts-as-taggable-on

11
推荐指数
1
解决办法
220
查看次数

使用SWIG在Python中包装C++类

example.h:

#ifndef EXAMPLE_H
#define EXAMPLE_H

class Math {
 public:
    int pi() const;
    void pi(int pi);
 private:
    int _pi;
};

#endif
Run Code Online (Sandbox Code Playgroud)

example.cpp:

#include "example.h"

int Math::pi() const {
    return this->_pi;
}  
void Math::pi(int pi) {
    this->_pi = pi;
}
Run Code Online (Sandbox Code Playgroud)

example.swig:

%module example
%{ 
    #define SWIG_FILE_WITH_INIT
    #include "example.h"
%}
%include "example.h"
Run Code Online (Sandbox Code Playgroud)

然后我使用以下命令生成包装器"example.py"和"example_wrap.c":

swig  -python example.swig
Run Code Online (Sandbox Code Playgroud)

当我尝试使用以下代码编译包装类时:

g++ -fPIC -c example.cpp example_wrap.c -I/usr/local/include/python2.6/
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

example_wrap.cpp: In function "PyObject* Swig_var_Math_get()":
example_wrap.cpp:2725: error: expected primary-expression before "void"
example_wrap.cpp:2725: error: expected ")" before …
Run Code Online (Sandbox Code Playgroud)

c++ python swig

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

将矢量合并到现有矢量中

在C++中,给予vector<T> src, dst,两者已经排序,有没有更有效的进行合并的内容的方式src进入dst

size_t n = dst.size();
dst.insert(dst.end(), src.begin(), src.end());
std::inplace_merge(dst.begin(), dst.begin() + n, dst.end());
Run Code Online (Sandbox Code Playgroud)

?在我关心的情况下,T是一个小的(12-16字节,取决于ABI)POD结构,但每个向量包含数百万个元素,因此播放的内存总量是几十到几百兆.

c++ optimization stl

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

不懂-c -o的Unix C++编译器

Autoconf/Automake很难支持那些不理解同时使用-c-o选项的古老C编译器(用这个名称创建一个目标文件).有AM_PROG_CC_C_O一个特殊的包装脚本,如果你想使用模式,Automake手册会警告你使用它们subdir-objects.

没有一个AM_PROG_CXX_C_O.AM_PROG_CC_C_O改为测试C++编译器并不难,但我想知道是否有必要.有没有一个Unix C++编译器(可能是Cfront?)不支持同时使用-c-o?那么,那些不支持它的C编译器有多大 - 例如,有没有C89支持的编译器有这个问题?

c++ history portability autotools

10
推荐指数
1
解决办法
273
查看次数

sigsuspend与处理程序执行期间传递的其他信号

sigsuspend 更改信号掩码,暂停执行调用线程,直到它收到"其动作是执行信号捕获函数或终止进程的信号",然后(如果进程未终止且信号处理程序返回)将信号掩码恢复到其原始状态.

POSIX.1-2008的链接页面没有说明是否可以在一次调用中传递多个信号sigsuspend,也没有说明信号掩码变化的原子性; 即使在我看来,这是一个符合要求的实现sigsuspend,即使整个观点sigsuspend是它没有这个代码所具有的竞争条件:

int sigsuspend(const sigset_t *mask)
{
    sigset_t oldmask;
    if (sigprocmask(SIG_SETMASK, mask, &oldmask)) return -1;
    pause();
    if (sigprocmask(SIG_SETMASK, &oldmask, 0)) return -1;
    return -1;
}
Run Code Online (Sandbox Code Playgroud)

我实际上担心的场景是一个SIGUSR1用于与自身通信的程序(这是一个很长的故事),我需要一种方法来确保信号处理程序每次内部调用执行一次sigsuspend,即使其他进程也是如此系统发送信号.

所以我的问题是:

  1. 是否有要求(在POSIX或任何其他相关标准中)每次调用sigsuspend时最多提供一个(任何类型的)信号?
  2. sigsuspend是否有要求(同上)改变信号掩码,暂停执行,并原子恢复信号掩码?也就是说,没有任何风险,在上面的假设用户空间实现中,三个系统调用之间会"传递"信号?

由于这是相当抽象,下面的测试程序,我会喜欢总是打印1和顺利退出,但我担心,在某些情况下,可能打印2或0,挂起,直到警报响起,或崩溃.(C11原子用于过度谨慎;从技术上讲,你不允许从信号处理程序读取一个volatile sig_atomic_t,只一个.)它默认使用SIGUSR1,如果传递-r命令行则使用SIGRTMIN .

#define _XOPEN_SOURCE 700
#include <stdatomic.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>

#ifndef ATOMIC_INT_LOCK_FREE
#error "This …
Run Code Online (Sandbox Code Playgroud)

c posix signals language-lawyer

9
推荐指数
2
解决办法
1067
查看次数

避免multiprocessing.Pool工作者之间的不可用共享状态的全局变量

我经常发现自己用Python编写程序来构造一个大的(兆字节)只读数据结构,然后使用该数据结构来分析一个非常大的(总共几百兆字节)小记录列表.每个记录都可以并行分析,因此自然模式是设置只读数据结构并将其分配给全局变量,然后创建一个multiprocessing.Pool(通过隐式将数据结构复制到每个工作进程中fork)和然后用来imap_unordered并行处理记录.这种模式的骨架看起来像这样:

classifier = None
def classify_row(row):
    return classifier.classify(row)

def classify(classifier_spec, data_file):
    global classifier
    try:
        classifier = Classifier(classifier_spec)
        with open(data_file, "rt") as fp, \
             multiprocessing.Pool() as pool:
            rd = csv.DictReader(fp)
            yield from pool.imap_unordered(classify_row, rd)
    finally:
        classifier = None
Run Code Online (Sandbox Code Playgroud)

我因为全局变量之间的隐式耦合的不满意这点classifyclassify_row.理想情况下,我想写

def classify(classifier_spec, data_file):
    classifier = Classifier(classifier_spec)
    with open(data_file, "rt") as fp, \
         multiprocessing.Pool() as pool:
        rd = csv.DictReader(fp)
        yield from pool.imap_unordered(classifier.classify, rd)
Run Code Online (Sandbox Code Playgroud)

但是这不起作用,因为Classifier对象通常包含无法pickle的对象(因为它们是由作者不关心的扩展模块定义的); 我还读过如果它确实有效会很慢,因为在每次调用绑定方法时,Classifier对象都会被复制到工作进程中.

还有更好的选择吗?我只关心3.x.

python fork multiprocessing python-3.x python-multiprocessing

9
推荐指数
2
解决办法
441
查看次数