2010-06-18 118 views
1

我需要从stdin中吸取数据并创建一个对象。Python访问对象byref /需要标记

传入的数据长度在5到10行之间。每行都有一个进程号和一个IP地址或一个哈希。 例如:

pid=123 ip=192.168.0.1 - some data 
pid=123 hash=ABCDEF- 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查找的对象。

困难的部分是有多个数据流混合来自标准输入。 (可能有数百或数千个进程同时写入数据。)

我有拉出我需要的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日waaay回来,我记得能够处理对象byref而不是byval。 Python中有类似的东西吗?或者我刚刚接近这个错误?

回答

2

两个单独类型的字典(不叫他们阵!),byipbyhash - 为什么你需要smoosh都在一起和风险的冲突?

BTW,you't可能可以有以下两行背靠背:

myarray[hash] = myarray[ip] 
assert not(myarray[hash] == myarray[ip]) 

为了使assert抱着你必须做一些在别的之间(地干扰名不副实myarray)。

顺便说一句,在Python中的任务总是通过引用一个对象 - 如果你想要一个副本,你必须明确地要求一个副本。

2

Python only has references。

创建一次对象,并将其一次添加到所有相关的键。

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 
+0

我无法一次添加全部。每次我经历循环时,我都会得到不同的pid,ip和hash组合。每次通过循环时,我都知道我有什么组合,并通过数组来查看对象。然后我将它与新发现的pid,ip或hash关联起来。 例如,第一行可能只是一个pid。第二行可能是一个PID和散列。第三行可能是散列和ip。 似乎Python正在创建MyData的副本,例如我做了 mydict [ip] = mydict [hash]。 如果我然后做mydict [hash] .blah = 1,那么mydict [ip]不会改变。 – 2010-06-19 03:41:16

+0

这就是为什么'process()'返回它没有的位的None。不,它不会复制。 – 2010-06-19 07:02:03