Python通过引用/需要标记访问对象

Python通过引用/需要标记访问对象,python,object,tags,byref,Python,Object,Tags,Byref,我需要从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 = N

我需要从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、哈希或PID查找对象

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

我有正则表达式提取我需要的PID、IP和散列,但是如何通过这些值中的任何一个访问对象呢

我的想法是这样做:

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>
以下是错误的:

myarray[hash] == myarray[ip]
希望这是清楚的。 我不愿意承认,早在VB时代,我就记得能够用byref而不是byval处理对象。Python中有类似的东西吗?或者我只是走错路了?

Python只有引用

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

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
Python只有引用

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

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
制作两个单独的dict(不要称它们为数组!),
byip
byhash
——为什么你需要将所有内容放在一起,冒冲突的风险

顺便说一句,你不可能有以下两行背靠背:

myarray[hash] = myarray[ip]
assert not(myarray[hash] == myarray[ip])
要使
断言
保持住,您必须在两者之间执行其他操作(扰乱命名错误的
myarray

顺便说一句,Python中的赋值总是通过引用一个对象来完成的——如果你想要一个副本,你必须明确地要求一个副本。

制作两个单独的dict(不要称它们为数组!),
byip
byhash
——为什么你需要把所有东西都放在一起,冒冲突的风险

顺便说一句,你不可能有以下两行背靠背:

myarray[hash] = myarray[ip]
assert not(myarray[hash] == myarray[ip])
要使
断言
保持住,您必须在两者之间执行其他操作(扰乱命名错误的
myarray


顺便说一句,Python中的赋值总是通过引用一个对象来完成的——如果你想要一个副本,你必须明确要求一个。

我不能一次添加所有的副本。每次通过循环,我都会得到pid、ip和哈希的不同组合。每次通过循环,我都会找出我的组合,并在数组中查找对象。然后将其与新找到的pid、ip或哈希关联。例如,第一行可能只是一个pid。第二行可能是pid和哈希。第三行可能是散列和ip。例如,当我执行mydict[ip]=mydict[hash]时,Python似乎正在创建MyData的副本。如果我随后执行mydict[hash].blah=1,则mydict[ip]不会更改。这就是为什么
process()
对它没有的位返回
None
。不,它不会复制。我不能一次全部添加。每次通过循环,我都会得到pid、ip和哈希的不同组合。每次通过循环,我都会找出我的组合,并在数组中查找对象。然后将其与新找到的pid、ip或哈希关联。例如,第一行可能只是一个pid。第二行可能是pid和哈希。第三行可能是散列和ip。例如,当我执行mydict[ip]=mydict[hash]时,Python似乎正在创建MyData的副本。如果我随后执行mydict[hash].blah=1,则mydict[ip]不会更改。这就是为什么
process()
对它没有的位返回
None
。不,它不会复制。