假设我有一个包含两个子模块的包,并且__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 …
这是一个挑剔的细节问题,有三个部分.上下文是我希望说服一些人无条件地使用无条件<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部分,请仅在您可以命名特定实现并给出发布日期时回答.说明可能符合条件的实现的一般特征的答案对我没用.
我正在尝试编写一个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变量来自读取标准输入
在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行了.
在数据导入器中,我有一些代码试图将一堆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会运行适合用户输入的名称规范化,但不适用于批量数据导入,所以我不想这样做.
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++中,给予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结构,但每个向量包含数百万个元素,因此播放的内存总量是几十到几百兆.
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支持的编译器有这个问题?
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和顺利退出,但我担心,在某些情况下,可能打印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) 我经常发现自己用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)
我因为全局变量之间的隐式耦合的不满意这点classify和classify_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