我需要从stdin中获取数据并创建一个对象。
传入的数据长度在5到10行之间。 每行都有一个进程号和一个IP地址或一个哈希值。 例如:
pid=123 ip=192.168.0.1 - some data
pid=123 hash=ABCDEF0123 - more data
hash=ABCDEF123 - More data
ip=192.168.0.1 - even more data
我需要将这些数据放入类:
class MyData():
pid = None
hash = None
ip = None
lines = []
我需要能够通过IP,HASH或PID查找对象。
困难的部分是来自stdin的多个数据流混合在一起。 (可能有数百或数千个进程同时写入数据。)
我有正则表达式来提取我需要的PID,IP和HASH,但是如何通过任何这些值访问对象?
我的想法是做这样的事情:
myarray = {}
for each line in sys.stdin.readlines():
if pid and ip: #If we can get a PID out of the line
myarray[pid] = MyData().pid = pid #Create a new MyData object, assign the PID, and stick it in myarray accessible by PID.
myarray[pid].ip = ip #Add the IP address to the new object
myarray[pid].lines.append(data) #Append the data
myarray[ip] = myarray[pid] #Take the object by PID and create a key from the IP.
<snip>do something similar for pid and hash, hash and ip, etc...</snip>
这为我的数组提供了两个键(一个PID和一个IP),它们都指向同一个对象。 但是在循环的下一次迭代中,如果我找到(例如)IP和HASH并执行:
myarray[hash] = myarray[ip]
以下是假:
myarray[hash] == myarray[ip]
希望这很清楚。 我不想承认,在VB时代,我记得能够处理对象byref而不是byval。 Python中有类似的东西吗?或者我只是接近这个错误?
答案 0 :(得分:2)
Python only 有引用。
创建一次对象,并立即将其添加到所有相关的键中。
class MyData(object):
def __init__(self, pid, ip, hash):
self.pid = pid
...
for line in sys.stdin:
pid, ip, hash = process(line)
obj = MyData(pid=pid, ip=ip, hash=hash)
if pid:
mydict[pid] = obj
if ip:
mydict[ip] = obj
if hash:
mydict[hash] = obj
答案 1 :(得分:2)
制作两个单独的词组(并且不要将它们称为数组!),byip
和byhash
- 为什么需要将所有内容混合起来并冒险冲突?!
myarray[hash] = myarray[ip]
assert not(myarray[hash] == myarray[ip])
要让assert
抓住,必须在中间做其他事情(扰乱错误的myarray
)。
BTW平方,Python中的赋值总是通过引用一个对象 - 如果你想要一个副本,你必须明确要求一个。