1

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>

これにより、2 つのキー (PID と IP) を持つ配列が得られ、それらは両方とも同じオブジェクトを指します。しかし、ループの次の繰り返しで、(たとえば) IP と HASH を見つけて実行すると:

myarray[hash] = myarray[ip]

以下は偽です。

myarray[hash] == myarray[ip]

うまくいけば、それは明らかでした。VB の時代には、byval ではなく byref でオブジェクトを処理できたのを覚えています。Pythonに似たようなものはありますか? それとも、私はこれに間違って近づいていますか?

4

2 に答える 2

2

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
于 2010-06-18T04:49:35.543 に答える
2

2 つの別個の dict を作成します (配列とは呼ばないでください!)、byipそしてbyhash-- なぜすべてをまとめてスムーズにし、競合のリスクを冒す必要があるのでしょうか?!

ところで、次の 2 行を連続して使用することはできません。

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

assert保持するには、その間に何か他のことをしている必要myarrayがあります (誤った名前の を混乱させます)。

ところで、Python での割り当ては常にオブジェクトへの参照によるものです。コピーが必要な場合は、明示的に要求する必要があります。

于 2010-06-18T04:51:09.000 に答える