

実現したい事。

ぱっと見では、

あり得ないだろうかも 知れない、  
もしかしたら Python開発者しか、  
対処不可能かも 知れない、  
挙動不振を、

何とかしたい。

_  
概要、

Pythonで、

リストデータを スライスして、  
再結合する コードを、  
書きました。

_  
しかし、

リストデーターが たまに、  
一部 ロストします、

必ず ロストする訳でも、  
必ず 保全される訳でも、  
共に ありません、

だからこそ 困っています。

_  
しかも、

あり得ない コード構成下で、  
ロストします、

様々な サイトに、  
問い掛けましたが 解決しません、

手が 負えません、  
デバッグを お助けください。

_  
環境、

ウィンドウズ１１ 22H2  
Powershell 7.3.3  
python 3.11×64bit  
Microsoft配布版  
Visual Studio Code 1.76.1

_  
該当cord、

import対象cord、(iround.py)

[code]

    import numpy as LAC # ListArrayControl
    def iround(lis: list, dimensyon: int = 0, istypeint: bool = True):
        temp = (LAC.asarray(LAC.asarray((LAC.fabs((I := LAC.array(lis))) * (dimtemp := 10 **
                (0 - dimensyon + 1)) + 5) / 10, dtype=int), dtype=float) * LAC.sign(I)) / dimtemp * 10
        return LAC.asarray(temp, dtype=int) if (dimensyon > -1) and istypeint else temp
    
[/code]

問題の cord、

[code]

    # coding: UTF-8
    # python3.11
    
    from logging import StreamHandler, FileHandler, getLogger, DEBUG, INFO, ERROR, Formatter, WARNING, CRITICAL
    import pytest
    import traceback as TB
    import functools as FT
    import itertools as IT
    import math as MT
    import random as RA
    import numpy as LAC  # List Array Control.
    import tqdm as PGR  # Progress rate.
    from iround import iround
    import sys
    
    
    # Backtrace define section.
    ERRORformatter = Formatter(
        "  Alert I I %(levelname)s   %(message)s %(asctime)s %(filename)s")
    formatter = Formatter(
        "[%(levelname)s] %(asctime)s - %(message)s (%(filename)s)")
    logger = getLogger(__name__)
    
    nomalhandler = FileHandler("DEBUG.log")
    nomalhandler.setLevel(DEBUG)
    nomalhandler.setFormatter(formatter)
    
    WARNINGhandler = FileHandler("WARNING.log")
    WARNINGhandler.setLevel(WARNING)
    WARNINGhandler.setFormatter(formatter)
    
    terminalhandler = StreamHandler()
    terminalhandler.setLevel(ERROR)
    terminalhandler.setFormatter(ERRORformatter)
    logger.setLevel(DEBUG)
    logger.addHandler(nomalhandler)
    logger.addHandler(WARNINGhandler)
    logger.addHandler(terminalhandler)
    
    
    # Data definition section.
    recursionlimit = sys.getrecursionlimit()
    DisDataanomal = 0
    E_Recursivecount = 0
    Recursivemount = 3
    C_Recursivecount = 0
    C_Dataanomaly = 0
    P_Dataanomaly = 0
    
    # Unique random number routine.
    #    Center-biased random number.
    def Cran(end: int, start: int = 1, Centralization: int = 3):
        return iround([LAC.average(LAC.random.randint(start, end + 1,  Centralization))])[0]
        
        
        def list_action(action_times: int = 3, Orderlist: list = list(range(1, 55 + 1))):
        try:
            assert isinstance(Orderlist, (LAC.ndarray, list)) and not (isinstance(
                Orderlist[0], (LAC.ndarray, list)))
        except AssertionError:
            logger.debug(TB.format_exc)
        Orderlistlen = len(Orderlist)
        Spare_Orderlist = Orderlist
    
    # Random biased on one side.
        def Eran2(end: int, start: int = 1):
            temporary1 = RA.randint(start, min(end, 4 + start) + 1)
            try:
                assert temporary1 >= start
            except AssertionError:
                logger.debug(TB.format_exc)
                logger.debug(
                    f"Eran ŗ    l ُ픭   temporary1 = {temporary1}")
                return Eran2(end)
            except RecursionError:
    #            E_Recursivecount += 1
                logger.warning(TB.format_exc)
                logger.warning(
                    f"Eran ōċA Ăяo    {Recursivemount}   ₵ ܂   ")
                sys.setrecursionlimit(
                    sys.getrecursionlimit() + Recursivemount)
            except MemoryError:
                logger.error(TB.format_exc)
                raise MemoryError
            return temporary1
    
    # Overlap and integrate - routine.
        def Merements(target: list, removalside: list):
            temp1 = len(removalside)
            if temp1 < 3:
                target = removalside + target
                removalside = []
            else:
                temp2 = -Eran2(temp1)
                target = removalside[len(
                    removalside) + temp2: len(removalside)] + target
                removalside = removalside[: temp2]
            return target, removalside
    
        for J in range(action_times):
            temp1 = Cran(len(Orderlist), Centralization=15)
            temporary1 = Orderlist[:temp1]
            temporary2 = Orderlist[temp1:]
            temporary3 = []
            while (len(temporary1) > 0) and (len(temporary2) > 0):
                temporary3, temporary1 = Merements(temporary3, temporary1)
                temporary3, temporary2 = Merements(temporary3, temporary2)
            Orderlist = temporary1 + temporary2 + temporary3
        try:
            assert Orderlistlen == len(Orderlist)
        except AssertionError:
            logger.warning(TB.format_exc)
            logger.warning(
                f"list_action Ńf [ ^ ُ픭   Orderlistlen = {len(Orderlist)}")
            Orderlist = list_action(Orderlist=Spare_Orderlist)
        except RecursionError:
            logger.warning(TB.format_exc)
            logger.warning(
                f"list_action ōċA Ăяo    {Recursivemount}   ₵ ܂   ")
            sys.setrecursionlimit(
                sys.getrecursionlimit() + Recursivemount)
        except MemoryError:
            logger.error(TB.format_exc)
            raise MemoryError
        return Orderlist
    
    
    # Durability test routine.
    def Durabilitytest(plactics: int):
        l = 0
        for j in PGR.tqdm(range(plactics)):
            l += (len(list_action()) != 55) + 0
        print(f"{l} {l / plactics * 100}%")
    
    
    # main
    Durabilitytest(10 ** 7)
    
[/code]

_  
試したこと

データ欠損異常が、

以下の 範囲で、  
集中して 発生している事を、  
突き止めました。

[code]

        def Merements(target: list, removalside: list):
            temp1 = len(removalside)
            if temp1 < 3:
                target = removalside + target
                removalside = []
            else:
                temp2 = -Eran2(temp1)
                target = removalside[len(
                    removalside) + temp2: len(removalside)] + target
                removalside = removalside[: temp2]
            return target, removalside
    
        for J in range(action_times):
            temp1 = Cran(len(Orderlist), Centralization=15)
            temporary1 = Orderlist[:temp1]
            temporary2 = Orderlist[temp1:]
            temporary3 = []
            while (len(temporary1) > 0) and (len(temporary2) > 0):
                temporary3, temporary1 = Merements(temporary3, temporary1)
                temporary3, temporary2 = Merements(temporary3, temporary2)
            Orderlist = temporary1 + temporary2 + temporary3
    
[/code]

_  
所が、

弊者調査では Merementsでは、  
データ欠損が 起きない事が、  
判明しています。

_  
詰まりは、

調査が 正しいなら、  
以下の 範囲で、  
データ欠損が 発生している、  
事となります。

[code]

        for J in range(action_times):
            temp1 = Cran(len(Orderlist), Centralization=15)
            temporary1 = Orderlist[:temp1]
            temporary2 = Orderlist[temp1:]
            temporary3 = []
            while (len(temporary1) > 0) and (len(temporary2) > 0):
              処理、
            Orderlist = temporary1 + temporary2 + temporary3
    
[/code]

ちょっと 目を、  
疑いますよね。

_  
本当に、

此の範囲で トラブルが、  
あるなら、

其れは、  
仕様の 問題が、  
疑われ、

流石に 個人では、  
特に 新規参入者には、  
どうしようもないと 思います、

お助けを 頂けませんか？

_  
補足情報、

※注：Warningを 大量に、  
ファイルに 吐き出します、  
お気を付けください。  
_/_ / _/_ / _/_ / _/_ / _/_ / _/_ / _/_ / _/_ / _/_ / _/_ / _/_ / _/_ / _/_ /
_/_ / _/_ / _/_ / _/_ / _/_ / _/_ / _/_ / _/_ / _/_ / _/_ / _/_ / _/_ / _/_ /
_/_ / _/_ / _/_ / _/_ / _/_ / _/_ / _/_ / _/_ / _/_ / _/_ / _/_ /

Merementsルーチン検証用コーディングを、  
追加します。

_  
先ず、

Eran最大値は 検証結果上、  
凡そ 6です。

_  
其処で、

Eran値を 1〜7まで、  
removalside要素数も 1要素数〜7要素数まで、  
全て 総当たりで、  
確認しました。

_  
此でも尚、

お手元の 環境で、  
oKが 出力されるようでしたら、  
コーディング内容を 見られても、  
お解り 頂けるように、

Merementsルーチンでの データ欠損は、  
起きない 事が、  
確認 頂けるものと、  
思います。

_  
尚、

当該コードは 当方では、  
ok以外の 出力が、  
みられない 事が、  
確認できています。

_  
前記通り、

Merementsルーチンの 問題ではない、  
事を、  
納得 頂けますよね？

_  
さて、

では 確認コードを、  
テスト 頂き、  
無関係な 発言は、  
なきように 願えますか？

結構 無駄で、  
手間なものでね。

[code]

    j = 0
    k = 0
    Eran2 = lambda X: j
    def test(func):
        pass
        def wrap(*args, **kwargs):
            a = [1, 2, 3, 4, 5, 6, 7]
            master = []
            global k, j
            for i in a:
                master.append(a)
                applicable = master
                for j in range(-1, -7, -1):
                    temp1, temp2 = func([], applicable)
                    k += 0 if len(master) == len(temp1) + len(temp2) else 1
            return
        return wrap
    @test
    def Merements(target: list, removalside: list):
        temp1 = len(removalside)
        if temp1 < 3:
            target = removalside + target
            removalside = []
        else:
            temp2 = -1 * Eran2(temp1)
            target = removalside[len(removalside) +
                                 temp2: len(removalside)] + target
            removalside = removalside[: temp2]
        return target, removalside
    
    print(str(k) if Merements([], []) else "ok")
    
[/code]


CC BY-SA 4.0
2023-03-16T00:19:54.640
94199
2023-04-26T03:57:44.527
2023-04-26T03:57:44.527
2238
44463
question
python3 debugging
Pythonのbugでしょうか？


バグはここにあります：

[code]

    temp2 = -Eran2(temp1)
    
[/code]

結果が範囲外になる場合があります。  
次のように置き換えてください:

[code]

    temp2 = Eran2(temp1)
    if (temp2 > len(removalside)):
        temp2 = len(removalside)
    temp2 = -temp2
    
[/code]


CC BY-SA 4.0
2023-03-25T17:12:16.357
94316
2023-03-25T17:12:16.357
54819
94199
answer