Python доступ к объекту byref / Нужна пометка - PullRequest
1 голос
/ 18 июня 2010

Мне нужно высосать данные из стандартного ввода и создать объект.

Входящие данные имеют длину от 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]

Следующее значение False:

myarray[hash] == myarray[ip]

Надеюсь, это было ясно,Я не хочу признавать, что в те дни, когда я жил в VB, я помню, как мог обрабатывать объекты byref, а не byval.Есть ли что-то подобное в Python?Или я просто неправильно это подхожу?

Ответы [ 2 ]

2 голосов
/ 18 июня 2010

Сделайте два отдельных диктанта (и не называйте их массивами!), byip и byhash - зачем вам все вместе и рискуют конфликтами?!

Кстати, вы не можете иметь следующие две строки подряд:

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

Чтобы заставить assert удерживать вас, должен делать что-то еще между ними (возмущая ошибочно названного myarray).

Кстати, квадрат, назначения в Python всегда по ссылке на объект - если вы хотите получить копию, вы должны явно запросить ее.

2 голосов
/ 18 июня 2010

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...