自从我读到Dave Beazley关于二进制I/O处理的帖子(http://dabeaz.blogspot.com/2009/08/python-binary-io-handling.html)以来,我一直想创建一个特定的Python库.电线协议.但是,我找不到可变长度结构的最佳解决方案.这就是我想要做的事情:
import ctypes as c
class Point(c.Structure):
_fields_ = [
('x',c.c_double),
('y',c.c_double),
('z',c.c_double)
]
class Points(c.Structure):
_fields_ = [
('num_points', c.c_uint32),
('points', Point*num_points) # num_points not yet defined!
]
Run Code Online (Sandbox Code Playgroud)
该类Points
将无法工作,因为num_points
尚未定义.我可以_fields_
稍后重新定义变量num_points
,但由于它是一个类变量,它会影响所有其他Points
实例.
什么是这个问题的pythonic解决方案?
我发现在Javascript中添加表单的输入非常简单,但由于某种原因,添加带选项的选择输入无效.选项出现在下拉列表之外.
这是我在jsfiddle中的代码:http://jsfiddle.net/LNVTQ/
这是我的代码内联:
var choices=[];
choices[0]="one";
choices[1]="two";
function addInput(divName){
var newDiv=document.createElement('div');
newDiv.innerHTML="<select>";
for(i=0; i<choices.length; i=i+1){
newDiv.innerHTML=newDiv.innerHTML+"<option value='"+choices[i]+"'>"+choices[i]+"</option>";
}
newDiv.innerHTML=newDiv.innerHTML+"</select>";
document.getElementById(divName).appendChild(newDiv);
}
Run Code Online (Sandbox Code Playgroud)
和HTML:
<form class="new" method="post" action="/jobs">
<div id="dynamicInput"></div>
<input type="button" value="Add" onclick="addInput('dynamicInput');" />
<input type="button" value="Save" />
</form>
Run Code Online (Sandbox Code Playgroud)
我会接受使用jQuery或只是vanilla Javascript的答案.
我想创建一个服务器和客户端,使用Twisted从网络发送和接收UDP数据包.我已经用Python中的套接字编写了这个,但是想要利用Twisted的回调和线程功能.但是,我需要帮助设计Twisted.
我有多种类型的包我想收到,但让我们假装只有一个:
class Packet(object):
def __init__(self, data=None):
self.packet_type = 1
self.payload = ''
self.structure = '!H6s'
if data == None:
return
self.packet_type, self.payload = struct.unpack(self.structure, data)
def pack(self):
return struct.pack(self.structure, self.packet_type, self.payload)
def __str__(self):
return "Type: {0}\nPayload {1}\n\n".format(self.packet_type, self.payload)
Run Code Online (Sandbox Code Playgroud)
我制作了一个协议类(几乎是示例的直接副本),当我从另一个程序发送数据时,这似乎有效:
class MyProtocol(DatagramProtocol):
def datagramReceived(self, data, (host, port)):
p = Packet(data)
print p
reactor.listenUDP(3000, MyProtocol())
reactor.run()
Run Code Online (Sandbox Code Playgroud)
我不知道的是我如何创建一个可以在网络上发送任意数据包的客户端,这些数据包会被反应堆接收:
# Something like this:
s = Sender()
p = Packet()
p.packet_type = 3
s.send(p.pack())
p.packet_type = 99
s.send(p.pack())
Run Code Online (Sandbox Code Playgroud)
我还需要确保在客户端和服务器上设置重用地址标志,以便我可以在同一设备上同时运行每个实例的多个实例(例如,一个脚本正在发送心跳,另一个脚本响应心跳等).
有人能告诉我如何用Twisted完成这项工作吗?
更新:
这就是我在Python中使用套接字的方法.我可以同时运行多个听众和发送者,他们都会互相听到.如何使用Twisted获得此结果?(听力部分不必是一个单独的过程.)
class …
Run Code Online (Sandbox Code Playgroud) 我正在尝试为我在此处创建的类创建一个元类:ctypes 可变长度结构
我想简化 Points 类,使其看起来像这样(Python 3.2):
class Points(c.Structure, metaclass=VariableMeta):
_fields_ = [
('num_points', c.c_uint32),
('points', 'Point*self.num_points')
]
def __init__(self):
self.num_points = 0
self.points = [0,]*MAX_SIZE
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止的元类:
class VariableMeta(type):
def __new__(cls, name, bases, dct):
dct['_inner_fields'] = dct['_fields_']
dct['_fields_'] = [('_buffer', c.c_byte*MAX_PACKET_SIZE)]
return type.__new__(cls, name, bases, dct)
def parse(self):
fields = []
for name, ctype in self._inner_fields:
if type(ctype) == str:
ctype = eval(ctype)
fields.append((name, ctype))
class Inner(c.Structure, PrettyPrinter):
_fields_ = fields
inner = Inner.from_address(c.addressof(self._buffer))
setattr(self, name, getattr(inner, name))
self = …
Run Code Online (Sandbox Code Playgroud) python ×3
ctypes ×1
forms ×1
html ×1
javascript ×1
metaclass ×1
python-3.x ×1
twisted ×1
udp ×1