Мне нужно сосать данные из 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]
Ниже указано False:
myarray[hash] == myarray[ip]
Надеюсь, это было ясно. Мне не терпится признать, что waaay снова в дни VB, я помню, что я мог обрабатывать объекты byref вместо byval. Есть что-то подобное в Python? Или я просто подхожу к этому неправильно?
Сделайте два отдельных dicts (и не называйте их массивами!), byip
и byhash
- для чего вам нужно объединить все вместе и рискнуть конфликтами?!
Кстати, у вас могут быть две следующие линии:
myarray[hash] = myarray[ip]
assert not(myarray[hash] == myarray[ip])
Чтобы сделать assert
, вы должны > делать что-то другое между ними (возмущение неназванного myarray
).
Квадрат BTW, присваивания в 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
process()
возвращаетNone
для битов, которых у него нет. И нет, он не делает копии.