-1

2.7.9 と 2.7.11 の間でネームスペース処理の変更はありましたか?

TL;DR: Stack Overflow で 450 件以上の回答を提供した後。私はスタック オーバーフローのルールを知っており、問題の絞り込み/分離に努めましたが、以下のすべての理由により、公正な MCVE を投稿することは事実上不可能です。

以下に投稿された生体内診断が証明されました. np.ndarray 呼び出しに名前空間の問題はありません.最初の行が numpy ( np ) シンボルにアクセス/使用しようとするまで、行 14644 (元の番号付けでは 14630 )

  aDSegFLOAT = np.ndarray( ( 80, 7 ), ...

それまでの動作する numpy 呼び出しが突然例外を発生させる場所:

UnboundLocalError: 割り当て前に参照されたローカル変数 'np'


はじめに:
定量的モデリングの目的で、かなり広範なpythonモジュール コードが、技術的な分析と予測のために運用される分散処理フレームワークで再利用されています。量子モデル (予測に使用されている) は数十 CPU コア時間という驚くべきコストで生成されるという事実により、ステートフル モジュールreload( QuantFX )-s を可能にするいくつかの追加手段が導入され、これらが保護されるようになりました。量子モデルのすでに精巧なインスタンスですが、モジュール機能をオンザフライで更新、微調整、再テストすることができます。

事実:
import QuantFX動作を停止しnumpy、変更されていない呼び出しで例外をスローします:

  • モジュール コードは、[QUANT-TOOLS]、[MODEL] セクションだけを更新して、過去 12 か月間使用されました
  • コードはマルチパーティ分散処理の Python 2.7 の一部であるため、MCVE を試みてもエコシステムの動作が反映または複製されることはありません。

問題が発生したとき:ホスト用
の最近の Anaconda ( miniconda4.0.0 / 4.0.5 ) パッケージ マネージャーをロードした後、2.7.11 と呼ばれるモジュールにも再配置され、この更新が他の Anaconda で問題なく実行されるまでの間Python での 2.2.0 (32 ビット) のインストールが動作を停止し、奇妙な外観の例外が発生するVM02/wXPpythonQuantFX.py2.7.9

機能不全の運用状態を示すもの:週ごとに数十か月間、
非常にうまくいっています。now をimport QuantFX呼び出すと、例外が発生し、あたかもがまったく編集されていないかのように(221 行を参照) 、何らかのローカル変数であると見なされますQuantFX.aMiniRESPONDER()Tracebacknumpyimport

    ... 
    [aMiniRESPONDER]: messaging & signalling sockets RTO:<infrastructure-setup>
    START:
           Sun Apr 17 20:19:33 2016 ...
    [aMiniRESPONDER]: final attempt to de-block a remote-processing failed at aXmitSOCKET.send()

    SIG->: Sun Apr 17 20:19:33 2016 PUB-lished a <_|SIG_EXIT|_> signal to peers, will sleep( 3 ) to allow for reception
    ZMQ:
           Sun Apr 17 20:19:36 2016 Graceful Exit Done. RET(0)
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "QuantFX.py", line 14630, in aMiniRESPONDER
        aDSegFLOAT= np.ndarray( ( 80, 7 ),
    UnboundLocalError: local variable 'np' referenced before assignment

numpy(インタプリタ コマンド ライン プロンプトでまったく同じ関数を手動で呼び出す間、モジュールによって -ed されたもの (以下の 221 行目)はうまく
いきましたnamespacenumpyimport

|>>> QuantFX.np.ndarray( ( 2, 3 ), dtype = QuantFX.np.float32, order = 'F' )
array([[  1.22325565e+10,  -2.81789980e-05,   1.22325565e+10],
       [  1.91215026e+00,  -1.81719875e+00,   1.91215026e+00]], dtype=float32)
+0:00:13.282000
22:20:54
|
|>>> QuantFX.np.__version__
'1.10.4'
+0:00:24.438000
22:21:18
|

)。

行 14630 のコンテキストTracebackと詳細:

local-view-on-Traceback + Context-less modus operandi late-imports を含む。 numpy ライン 14426

221 行目import numpy as np+ State-Full リロードの概念:

![global-view-on-module + import numpy as np # 221行目

QuantFXモジュールのコーディングは PEP* などに関して異議を唱える可能性がありますが、シンタックス コンストラクターは、/ を介したコンテキスト フル モードの操作と、最小限の RAM/CPU での高速で安全なコンテキストのない軽量操作の両方を可能にするように決定されましimportreload()。診断または制御 CLI の目的で 1 つのコンポーネント コードのみを選択/コピー/貼り付け (aRemoteKEYBOARD()または など) してリモート ターミナルを消費しますが、モジュール全体aMiniRESPONDER()は必要ありません (上記を含む後期インポートのプロビジョニング(行 14426 )そのような-文脈のない手口のために)。importQuantFXnumpyQuantFX


求めるもの:

2.7.9 と 2.7.11 の間の変更に関する説明は、観測されたnp.ndarray()衝突に関連している可能性があり、先週の金曜日に導入されました。

代替モジュール構文コンストラクターのレイアウトの推奨事項も、そのような提案がステートフルネスの両方を維持しreload( QuantFX )、コンテキストフルとコンテキストレスの両方のコードベースコンポーネントの使用を許可する場合、高い価値があります。


アップデート:

可能性のある外観とは対照的に、この投稿の前に、問題の分離を可能にするために生体内自己診断を追加するための適切なレビューとデバッグ作業が行われました。

   """ DEBUG: VM02, after about-a-year working here stable... THROWS EXC. HERE: "UnboundLocalError: local variable 'np' referenced before assignment"                                 ????? .EXC on np.ndarray()
            >>> import QuantFX
            Is QuantFX_FLAG seen in dir() during <module> import:  True
            SECTION: ____IDENTIFY____ [TRY].OK
            SECTION: ____IDENTIFY____ [FIN]
            SECTION: import           [TRY].OK
            SECTION: import           [FIN]
            SECTION: FX-MARKET CONTEXTs [TRY].OK
            SECTION: FX-MARKET CONTEXTs [FIN]
            SECTION:    GENERAL TOOLS [TRY].OK
            SECTION:    GENERAL TOOLS [FIN]
            SECTION:     DATA INPUTs [TRY].OK
            SECTION:     DATA INPUTs [FIN]
            SECTION: v41 PROCESS [TRY].OK
            SECTION: v41 PROCESS [FIN]
            SECTION: v41 QUANT TOOLS [TRY].OK
            SECTION: v41 QUANT TOOLS [FIN]
            QuantFX.py:10966: RuntimeWarning: invalid value encountered in divide
            ST2  = np.where( ST2 != 0, ( ST[-LLV.shape[0]:] - LLV ) /  ST2, ST2 ) # / ST2 ( == HHV - LLV )          #        __main__:4162: RuntimeWarning: invalid value encountered in divide
            SECTION: v41 MODEL [TRY].OK
            SECTION: v41 MODEL [FIN]
            SECTION: v41 PREDICTOR [TRY].OK
            SECTION: v41 PREDICTOR [FIN]
            SECTION: MetaTrader RESPONDER [TRY].OK
            SECTION: MetaTrader RESPONDER [FIN]
            SECTION: ____TEMPLATE____ [TRY].OK
            SECTION: ____TEMPLATE____ [FIN]
            SECTION: ____TEMPLATE____ [TRY].OK
            SECTION: ____TEMPLATE____ [FIN]
            SECTION: ____TEMPLATE____ [TRY].OK
            SECTION: ____TEMPLATE____ [FIN]
            +0:00:01.219000
            18:20:14
            |
            |>>> QuantFX.aMiniRESPONDER( aTarget2Bind2_URL = "tcp://10.0.0.62:9999", anInstrumentDictOfPARAMs = QuantFX.anFxCTX[ QuantFX.aCtxID ] )
            [aMiniRESPONDER]: runs in it's own full QuantFX context
            [aMiniRESPONDER]: imports DONE
            [aMiniRESPONDER]: variables DONE
            [aMiniRESPONDER]: messaging & signalling sockets RTO:[aZmqCONTEXT] <class 'zmq.sugar.context.Context'> setup with 15.2.0 version
            [aMiniRESPONDER]: messaging & signalling sockets     [aXmitSOCKET]-pre
            [aMiniRESPONDER]: messaging & signalling sockets     (aXmitSOCKET)-to be instantiated-via a call to aZmqCONTEXT.socket( zmq.PAIR )
            [aMiniRESPONDER]: messaging & signalling sockets     [aXmitSOCKET]-post
            [aMiniRESPONDER]: messaging & signalling sockets     [aXmitSOCKET]-bind()
            [aMiniRESPONDER]: messaging & signalling sockets RTO:[aXmitSOCKET]
            [aMiniRESPONDER]: messaging & signalling sockets RTO:[aCtrlSOCKET]
            [aMiniRESPONDER]: messaging & signalling sockets RTO:[aSIGsSOCKET]
            [aMiniRESPONDER]: messaging & signalling sockets RTO:<infrastructure-setup>
            START:
                Sun Apr 17 20:19:33 2016 ...
            [aMiniRESPONDER]: final attempt to de-block a remote-processing failed at aXmitSOCKET.send()

            SIG->: Sun Apr 17 20:19:33 2016 PUB-lished a <_|SIG_EXIT|_> signal to peers, will sleep( 3 ) to allow for reception
            ZMQ:
                Sun Apr 17 20:19:36 2016 Graceful Exit Done. RET(0)
            Traceback (most recent call last):
            File "<stdin>", line 1, in <module>
            File "QuantFX.py", line 14630, in aMiniRESPONDER
                aDSegFLOAT= np.ndarray( ( 80, 7 ),                    
            UnboundLocalError: local variable 'np' referenced before assignment

インビボ numpy-nd.array-symbol-checker

@viraptorからの生体内チェッカーのアイデア提案付き

    def debug_check_np_ndarray( aCallerSideInspectFrameINFO ):      # DEBUG-CHECK
        #ebug_check_np_ndarray( aCallerSideInspectFrameINFO = getframeinfo( currentframe() ) )
        #rom inspect import currentframe, getframeinfo              # EXTERNAL RESPONSIBILITY TO import + setup aCallerSideInspectFrameINFO .OnCall

        #ef         np_check():                                     # DEF:

        try:                                                        # TRY: np.*
            np.ndarray
            print 70*" ", "* NP: np.ndarray call [OK], FILE: ", aCallerSideInspectFrameINFO.filename, " LINE: ", aCallerSideInspectFrameINFO.lineno

        except:                                                     # EXC: found the issue
            print 70*" ", "* NP: np.ndarray call [**], FILE: ", aCallerSideInspectFrameINFO.filename, " LINE: ", aCallerSideInspectFrameINFO.lineno
            exc_type, exc_value, exc_traceback = sys.exc_info()             # prepare a traceback detail
            traceback.print_tb(  exc_traceback, limit = 5, file = sys.stdout )
            raise

        else:                                                       # ELSE: ok, passed
            #rint("* NP check ok")  # optionally add current function name via a traceback module
            return

起動時に詳細な行ごとの確認が提供され、クラッシュするまでLine 14644aDSegFLOAT = np.ndarray( ... )np.ndarray シンボルマスキングはありませんでした:

|>>> QuantFX.aMiniRESPONDER()
                                                                    * NP: np.ndarray call [OK], FILE:  QuantFX.py  LINE:  14387
                                                                    * NP: np.ndarray call [OK], FILE:  QuantFX.py  LINE:  14391
[aMiniRESPONDER]: runs in it's own full QuantFX context
                                                                    * NP: np.ndarray call [OK], FILE:  QuantFX.py  LINE:  14395
                                                                    * NP: np.ndarray call [OK], FILE:  QuantFX.py  LINE:  14404
                                                                    * NP: np.ndarray call [OK], FILE:  QuantFX.py  LINE:  14410
                                                                    * NP: np.ndarray call [OK], FILE:  QuantFX.py  LINE:  14412
                                                                    * NP: np.ndarray call [OK], FILE:  QuantFX.py  LINE:  14419
                                                                    * NP: np.ndarray call [OK], FILE:  QuantFX.py  LINE:  14423
[aMiniRESPONDER]: runs in a full QuantFX mode, few imports DONE
[aMiniRESPONDER]: imports DONE
                                                                    * NP: np.ndarray call [OK], FILE:  QuantFX.py  LINE:  14441
                                                                    * NP: np.ndarray call [OK], FILE:  QuantFX.py  LINE:  14443
[aMiniRESPONDER]: variables DONE
                                                                    * NP: np.ndarray call [OK], FILE:  QuantFX.py  LINE:  14454
                                                                    * NP: np.ndarray call [OK], FILE:  QuantFX.py  LINE:  14527
[aMiniRESPONDER]: messaging & signalling sockets RTO:[aZmqCONTEXT] <class 'zmq.sugar.context.Context'> setup with 15.2.0 version
[aMiniRESPONDER]: messaging & signalling sockets RTO:<infrastructure-setup>
                                                                    * NP: np.ndarray call [OK], FILE:  QuantFX.py  LINE:  14626
START:
    Tue Apr 19 16:02:12 2016 ...
                                                                    * NP: np.ndarray call [OK], FILE:  QuantFX.py  LINE:  14632
                                                                    * NP: np.ndarray call [OK], FILE:  QuantFX.py  LINE:  14643

[aMiniRESPONDER].FINALLY: will start attempts to de-block a remote-processing ( after a prior intentional SIG_EXIT or an unhandled EXC )
[aMiniRESPONDER]: final attempt to de-block a remote-processing failed at aXmitSOCKET.send()
[aMiniRESPONDER]: final attempt to propagate a signal to peers failed at aSIGsSOCKET.send()

EXC. ZmqError(ZMQError('No such file or directory')) on aSIGsSOCKET .setsockopt( zmq.LINGER, 0 ) / .close( aSIGsSOCKET )
EXC. ZmqError(ZMQError('No such file or directory')) on aCtrlSOCKET .setsockopt( zmq.LINGER, 0 ) / .close( aCtrlSOCKET )
EXC. ZmqError(ZMQError('No such file or directory')) on aXmitSOCKET .setsockopt( zmq.LINGER, 0 ) / .close( aXmitSOCKET )

ZMQ:
    Tue Apr 19 16:02:15 2016 Graceful Exit Done. RET(0)

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "QuantFX.py", line 14644, in aMiniRESPONDER
    aDSegFLOAT          = np.ndarray( ( 80, 7 ),                    #           #  DSegFLOAT[][]                                  ### ToDo.MS: size-independent ( 80+ )                   np.*()  :::::::::::::::
UnboundLocalError: local variable 'np' referenced before assignment
+0:00:10.734000
16:02:15
|            
4

2 に答える 2

4

簡単なスクリプトでエラーを再現できます-モジュールをインポートして、一度問題なく使用します。しかし、2回目に使用すると、グローバル割り当てがローカル割り当てによってマスクされます。このマスキングは、使用を試みた後にローカル割り当てが発生した場合でも発生します。

import collections    
def foo1():
   dd=collections.defaultdict(list)
   return dd

def foo2():
   dd=collections.defaultdict(int)
   collections = []
   return dd

print foo1()
print foo2()

生産する

2112:~/mypy$ python stack1.py
defaultdict(<type 'list'>, {})
Traceback (most recent call last):
  File "stack1.py", line 13, in <module>
    print foo2()
  File "stack1.py", line 8, in foo2
    dd=collections.defaultdict(int)
UnboundLocalError: local variable 'collections' referenced before assignment

あなたのコード、またはおそらくあなたが呼び出したものを検索して、np=...like ステートメントを探します。QuantFX.aMiniRESPONDERエラーの直接のコンテキストであるため、最初に を見てください。

私のテスト関数をに変更する

def foo2():
   dd = foo1()
   collections = []
   return dd

エラーは発生しません。したがって、マスキングの範囲はかなり限られています。

于 2016-04-19T04:15:33.460 に答える