我有一個允許用戶執行求和的函式,根據型別最多可以使用 4 個引數呼叫它,但由于某種原因它似乎將輸出放在螢屏上我無法追蹤
程式如下
from typing import Union, Callable
def Sum(*args: Union[int, float, Callable[[Union[int, float]], Union[int, float]]]) -> Union[int, float]:
print("Sum called with args", args)
start, stop, step, func = __SumProdSetup("Sum", *args)
if len(args) == 4 and all([isinstance(arg, float) for arg in args[1:]]) and callable(args[0]):
#SUMMATION CODE
else:
print("Called", args, "space")
def __SumProdSetup(name: str, *args: Union[int, float, Callable[[Union[int, float]], Union[int, float]]]) -> tuple[Union[int, float], Union[int, float], Union[int, float], Callable[[Union[int, float]], Union[int, float]]]:
print("Setup called with args", args)
raiserr = False
# Add different args combinations
raiseerr=True #added here for testing purposes
if raiserr:
raise ValueError(f"""((ADD USAGES))""")
else:
try:
return start, stop, step, func
except NameError as err:
err.args = f"Usage: {', '.join([str(arg) for arg in args])}",
raise err
Sum()
正如預期的那樣,這會產生 ValueError,因為沒有引數是無效用法。
但是,我也得到了無法追蹤的輸出。代碼中的任何地方都不應該列印“Called”。它應該(使用不同的用法)列印“Called”,然后是 args,然后是“space”。它也不應該列印“無”
但是,這是完整的輸出:(預期總和呼叫和設定呼叫)
Called
None
Sum called with args ()
Setup called with args ()
Traceback (most recent call last):
File "C:\Users\maxcu\OneDrive\JetbrainsProjects\python\Games\engine\__init__.py", line 173, in <module>
Sum()
File "C:\Users\maxcu\OneDrive\JetbrainsProjects\python\Games\engine\__init__.py", line 79, in Sum
start, stop, step, func = __SumProdSetup("Sum", *args)
File "C:\Users\maxcu\OneDrive\JetbrainsProjects\python\Games\engine\__init__.py", line 154, in __SumProdSetup
raise TypeError(f"""
TypeError:
Available usages:
Sum(int)
Sum(int, int)
Sum(float, float)
Sum(float, float, float)
Sum(Callable, int)
Sum(Callable, int, int)
Sum(Callable, float, float)
Sum(Callable, float, float, float)
'Called' 和 'None' 輸出是意外的,使用代碼搜索只產生三個列印結果;這些都不應該自己輸出“None”或“Called”
uj5u.com熱心網友回復:
找到了解決辦法!我正在匯入的一個模塊是一個自定義模塊(未包含在代碼段中,因為它僅在我的機器上找到并且未在導致問題的函式中使用)并且有一行列印了“已呼叫”和“無”內容
TL;DR 自定義模塊意外導致問題
這個問題現在可以關閉了
uj5u.com熱心網友回復:
雖然您可能已經在自己的實體中找到了罪魁禍首,但我很好奇如何解決這個問題。
這是一種解決方案。搞亂builtins在生產或任何重要的背景是幾乎總是一個壞主意,但對于本地除錯,這可能是有用的:
import builtins
import inspect
setattr(builtins, "old_print", print)
def new_print(*args, **kwargs):
caller = inspect.stack()[1]
builtins.old_print(f"{caller.filename}:{caller.lineno} |", *args, **kwargs)
setattr(builtins, "print", new_print)
if __name__ == '__main__':
print("Hello world")
這將print()呼叫的檔案和行號附加到輸出中。
結果:
E:\DevProjects\stack-exchange-answers\69668677\trace_print_origin.py:15 | Hello world
將其匯入另一個檔案:
import trace_print_origin
print("Hello import")
運行第二個檔案的結果:
E:\DevProjects\stack-exchange-answers\69668677\trace_print_origin_import.py:3 | Hello import
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/330977.html
標籤:蟒蛇-3.x
下一篇:使用海象運算子:=產生語法錯誤
