我想将一个参数传递给使用define_method定义的方法,我该怎么做?
我正在尝试编写一个装饰器来做日志记录:
def logger(myFunc):
def new(*args, **keyargs):
print 'Entering %s.%s' % (myFunc.im_class.__name__, myFunc.__name__)
return myFunc(*args, **keyargs)
return new
class C(object):
@logger
def f():
pass
C().f()
Run Code Online (Sandbox Code Playgroud)
我想要打印:
Entering C.f
Run Code Online (Sandbox Code Playgroud)
但我收到此错误消息:
AttributeError: 'function' object has no attribute 'im_class'
Run Code Online (Sandbox Code Playgroud)
据推测,这与'logger'中'myFunc'的范围有关,但我不知道是什么.
我目前正在开发一个程序,它可以嗅探从特定地址发送和接收的TCP数据包.我想要完成的是回复定制的数据包到某些收到的数据包.我已经完成了解析.我已经可以生成有效的以太网,IP和 - 大部分 - TCP数据包.
我唯一无法弄清楚的是如何确定seq/ack数.
虽然这可能与问题无关,但程序是使用WinPCap用C++编写的.我要求任何可能对我有帮助的提示,文章或其他资源.
这是我目前所拥有的:
void WriteHexToFile( std::ofstream &stream, void *ptr, int buflen, char *prefix )
{
unsigned char *buf = (unsigned char*)ptr;
for( int i = 0; i < buflen; ++i ) {
if( i % 16 == 0 ) {
stream << prefix;
}
stream << buf[i] << ' ';
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过做stream.hex,stream.setf(std :: ios :: hex),以及搜索一下Google.我也尝试过:
stream << stream.hex << (int)buf[i] << ' ';
Run Code Online (Sandbox Code Playgroud)
但这似乎也不起作用.
以下是它当前生成的一些输出的示例:
Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í …Run Code Online (Sandbox Code Playgroud) 我有一个'foreach'宏我经常在C++中使用,适用于大多数STL容器:
#define foreach(var, container) \
for(typeof((container).begin()) var = (container).begin(); \
var != (container).end(); \
++var)
Run Code Online (Sandbox Code Playgroud)
(注意'typeof'是gcc扩展名.)它的使用方式如下:
std::vector< Blorgus > blorgi = ...;
foreach(blorgus, blorgi) {
blorgus->draw();
}
Run Code Online (Sandbox Code Playgroud)
我想做一些类似迭代地图值的东西.也许称之为"foreach_value".所以不要写作
foreach(pair, mymap) {
pair->second->foo();
}
Run Code Online (Sandbox Code Playgroud)
我会写的
foreach_value(v, mymap) {
v.foo();
}
Run Code Online (Sandbox Code Playgroud)
我不能想出一个会这样做的宏,因为它需要声明两个变量:迭代器和值变量(上面的'v').我不知道如何在for循环的初始化器中做到这一点,即使使用gcc扩展.我可以在foreach_value调用之前声明它,但是它会与同一范围内的foreach_value宏的其他实例冲突.如果我可以将当前行号后缀为迭代器变量名,它可以工作,但我不知道该怎么做.
我有一个函数,它将另一个函数作为参数.如果函数是类的成员,我需要找到该类的名称.例如
def analyser(testFunc):
print testFunc.__name__, 'belongs to the class, ...
Run Code Online (Sandbox Code Playgroud)
我想
testFunc.__class__
Run Code Online (Sandbox Code Playgroud)
会解决我的问题,但这只是告诉我testFunc是一个函数.
typedef unsigned char Byte;
...
void ReverseBytes( void *start, int size )
{
Byte *buffer = (Byte *)(start);
for( int i = 0; i < size / 2; i++ ) {
std::swap( buffer[i], buffer[size - i - 1] );
}
}
Run Code Online (Sandbox Code Playgroud)
这个方法现在做的是它在内存中反转字节.我想知道的是,有没有更好的方法来达到同样的效果?整个"尺寸/ 2"部分似乎是一件坏事,但我不确定.
编辑:我刚刚意识到我为这个问题提出的标题有多糟糕,所以我[希望]修复它.
Xcode允许您创建自动脚本以执行重复性任务.您编写了哪些脚本来加速开发?
给定一个中等复杂的XML结构(数十个元素,数百个属性),没有XSD,并且希望创建一个对象模型,那么避免编写样板from_xml()和to_xml()方法的优雅方法是什么?
例如,给定:
<Foo bar="1"><Bat baz="blah"/></Foo>
Run Code Online (Sandbox Code Playgroud)
我如何避免编写无穷无尽的序列:
class Foo
attr_reader :bar, :bat
def from_xml(el)
@bar = el.attributes['bar']
@bat = Bat.new()
@bat.from_xml(XPath.first(el, "./bat")
end
etc...
Run Code Online (Sandbox Code Playgroud)
我不介意明确地创建对象结构; 这是我确信可以通过一些更高级别的编程来处理的序列化......
我不是试图为每个类保存一行或两行(通过将from_xml行为移动到初始化器或类方法等).我正在寻找复制我心理过程的"元"解决方案:
"我知道每个元素都将成为一个类名.我知道每个XML属性都是一个字段名.我知道要分配的代码只是@#{attribute_name} = el.[#{attribute_name}然后递归到子元素.然后反转到to_xml."
我同意建议"构建器"类加上XmlSimple似乎是正确的路径.XML - >哈希 - >? - >对象模型(和利润!)
更新2008-09-18 AM:来自@ Roman,@ fatgeekuk和@ScottKoon的优秀建议似乎打破了问题.我下载了HPricot源码,看看它是如何解决问题的; 关键方法显然是instance_variable_set和class_eval.irb工作非常鼓舞人心,现在正朝着实施方向迈进......非常激动
我使用类似下面的内容为我的应用程序编写策略:
策略类如下所示:
struct Policy {
static void init();
static void cleanup();
//...
};
template <class CarT, class CdrT>
struct Cons {
static void init() {
CarT::init();
CdrT::init();
}
static void cleanup() {
CdrT::cleanup();
CarT::cleanup();
}
//...
};
Run Code Online (Sandbox Code Playgroud)
撰写政策:
typedef Cons<Policy1, Cons<Policy2, Cons<Policy3, Policy4> > > MyPolicy;
Run Code Online (Sandbox Code Playgroud)
要使用MyPolicy:
init_with<MyPolicy>(...);
//...
cleanup_with<MyPolicy>(...);
Run Code Online (Sandbox Code Playgroud)
他们打电话的地方:
MyPolicy::init_options(); // calls Policy1 to 4's init in order
Run Code Online (Sandbox Code Playgroud)
和
MyPolicy::cleanup(); // calls Policy1 to 4's cleanup in reverse order
Run Code Online (Sandbox Code Playgroud)
从本质上讲,Cons在这里构造一个类型列表.这很直接.然而,typedef cons line有点难看.拥有可以执行此操作的策略组合器是理想的:
typedef CombinePolicy<Policy1, Policy2, Policy3, Policy4> MyPolicy; …Run Code Online (Sandbox Code Playgroud)