-2

興味深い問題があります。私は - くすくす笑いながら - 本当にすぐにプログラムを書こうとしています。2行に減らしましたが、競合状態があり、その理由がわかりません。その要点は次のとおりです。

imports...
...[setattr(__main__, 'f', [1, 2, ..]), reduce(...random.choice(f)...)][1]...

時々、次の例外が生成されます。しかしいつもではない。それが私の問題です。特にリストトリックを使用しているため、実行の順序が保証されていないと思われます-おそらくインタープリターは setattr() が None を返し、リストの2番目のもののみを選択していることを知っていると予測できると思います、したがって、実際の setattr() を後で延期します。しかし、それは時々しか起こりません。何か案は?CPython は、map、filter、reduce 呼び出しなどを自動的にスレッド化しますか?

Traceback (most recent call last):
  File "/usr/lib64/python3.4/random.py", line 253, in choice
    i = self._randbelow(len(seq))
  File "/usr/lib64/python3.4/random.py", line 230, in _randbelow
    r = getrandbits(k)          # 0 <= r < 2**k
ValueError: number of bits must be greater than zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test4.py", line 2, in <module>
    print(" ".join([setattr(n,'f',open(sys.argv[1],"r").read().replace("\n"," ").split(" ")),setattr(n,'m',c.defaultdict(list)),g.reduce(lambda p,e:p+[r.choice(m[p[-1]])],range(int(sys.argv[2])),[r.choice(list(filter(lambda x:[m[x[0]].append(x[1]),x[0].isupper()][1],zip(f[:-1],f[1:]))))[0]])][2]))
  File "test4.py", line 2, in <lambda>
    print(" ".join([setattr(n,'f',open(sys.argv[1],"r").read().replace("\n"," ").split(" ")),setattr(n,'m',c.defaultdict(list)),g.reduce(lambda p,e:p+[r.choice(m[p[-1]])],range(int(sys.argv[2])),[r.choice(list(filter(lambda x:[m[x[0]].append(x[1]),x[0].isupper()][1],zip(f[:-1],f[1:]))))[0]])][2]))
  File "/usr/lib64/python3.4/random.py", line 255, in choice
    raise IndexError('Cannot choose from an empty sequence')
IndexError: Cannot choose from an empty sequence

setattr() を使用する代わりに globals() と vars() を変更しようとしましたが、役に立たないようです (同じ例外シーケンス)。

実際のコードは次のとおりです。

import sys,collections as c,random as r,functools as g,__main__ as n
print(" ".join([setattr(n,'f',open(sys.argv[1],"r").read().replace("\n"," ").split(" ")),setattr(n,'m',c.defaultdict(list)),g.reduce(lambda p,e:p+[r.choice(m[p[-1]])],range(int(sys.argv[2])),[r.choice(list(filter(lambda x:[m[x[0]].append(x[1]),x[0].isupper()][1],zip(f[:-1],f[1:]))))[0]])][2]))

参考までに:これはテキストファイルを読み込んでマルコフモデルを生成し、文章を吐き出すというものです。

4

2 に答える 2