Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何重写显式传递的参数_Python_Python 3.x_Functools - Fatal编程技术网

Python 如何重写显式传递的参数

Python 如何重写显式传递的参数,python,python-3.x,functools,Python,Python 3.x,Functools,我需要重写一些函数参数。 例如,我总是想用参数调用print函数:end='…\r\n'。 我正在使用functools来实现这一点: 导入工具 print=functools.partial(print,end='…\r\n') 如果未将参数传递给print函数,则该函数有效: 打印(1) 1. 但是如果有人使用end参数调用print,我的覆盖将被忽略: print(1,end='222\r\n') 1222 但是,我希望覆盖能够工作(我需要获得此输出): print(1,end='2

我需要重写一些函数参数。 例如,我总是想用参数调用
print
函数:
end='…\r\n'
。 我正在使用
functools
来实现这一点:

导入工具
print=functools.partial(print,end='…\r\n')
如果未将参数传递给
print
函数,则该函数有效:

打印(1)
1.
但是如果有人使用
end
参数调用
print
,我的覆盖将被忽略:

print(1,end='222\r\n')
1222
但是,我希望覆盖能够工作(我需要获得此输出):

print(1,end='222\r\n')
1.

如何做到这一点?

好的,首先请注意,并非该库中的所有打印函数都具有和end=“”。事实上,当他们不包含换行符时,似乎有一个逻辑,所以奇怪的是,你发现输出不可行。您确定没有其他原因导致此问题吗?例如,如果你在一个容器中运行,那可能会弄乱你的日志

假设Amazon已经搞砸了,我仍然建议您的第一个策略是在Github上打开一个问题或提交一个请求。重写标准库来处理糟糕的第三方库应该是最后的手段,如果这是一种手段的话

只是为了强调为什么,如果您忽略了打印的含义,那么您几乎是在使用一种新的编程语言。在这条路上走得太远,一切都将是不可预测和不受支持的,您将很难说服其他人为您的代码做出贡献


但是,如果必须这样做,有一些方法可以挂接到print调用,并运行pre函数。我认为最好的方法是捕获stdout本身。因为这样,打印的行为不受影响(它仍然将数据发送到stdout)。你只是说你想让stdout在你的环境中做一些不同的事情,这并不是不寻常的事情。请参阅此处的示例和此方法的示例:这是一个直接连接到打印的示例:

好的,首先请注意,该库中并非所有打印函数都具有和end=“”。事实上,当他们不包含换行符时,似乎有一个逻辑,所以奇怪的是,你发现输出不可行。您确定没有其他原因导致此问题吗?例如,如果你在一个容器中运行,那可能会弄乱你的日志

假设Amazon已经搞砸了,我仍然建议您的第一个策略是在Github上打开一个问题或提交一个请求。重写标准库来处理糟糕的第三方库应该是最后的手段,如果这是一种手段的话

只是为了强调为什么,如果您忽略了打印的含义,那么您几乎是在使用一种新的编程语言。在这条路上走得太远,一切都将是不可预测和不受支持的,您将很难说服其他人为您的代码做出贡献

但是,如果必须这样做,有一些方法可以挂接到print调用,并运行pre函数。我认为最好的方法是捕获stdout本身。因为这样,打印的行为不受影响(它仍然将数据发送到stdout)。你只是说你想让stdout在你的环境中做一些不同的事情,这并不是不寻常的事情。请参阅此处的示例和此方法的示例:下面是一个直接挂接到打印的示例:

我该怎么做

你可能不应该那样做。至少没有更多的逻辑。执行
打印(…,end='')
的全部要点是以增量方式构造输出行。如果总是将其更改为
print(…,end='\r\n')
格式,则会破坏预期的输出格式。假设您真的想这样做,只需覆盖内置:

import builtins
import sys

real_print = builtins.print


def my_print(*values, sep=" ", end="", file=sys.stdout, flush=False):
    end += "\r\n"
    real_print(*values, sep=sep, end=end, file=file, flush=flush)


builtins.print = my_print
print("hello", end="")
print("goodbye", end="123")
print("really")
我该怎么做

你可能不应该那样做。至少没有更多的逻辑。执行
打印(…,end='')
的全部要点是以增量方式构造输出行。如果总是将其更改为
print(…,end='\r\n')
格式,则会破坏预期的输出格式。假设您真的想这样做,只需覆盖内置:

import builtins
import sys

real_print = builtins.print


def my_print(*values, sep=" ", end="", file=sys.stdout, flush=False):
    end += "\r\n"
    real_print(*values, sep=sep, end=end, file=file, flush=flush)


builtins.print = my_print
print("hello", end="")
print("goodbye", end="123")
print("really")

为什么要忽略显式参数?对于其他开发人员来说,这似乎是一次令人沮丧的经历。@jonrsharpe我使用的库在所有
print
调用中都会通过
end=“”
,我需要它用
end='\r\n'
调用
print
,因为目前格式已被破坏。库是什么?@Neil AWS Sagemaker,下面是一个示例:听起来您的场景需要
函数重载
——为什么要忽略显式参数?对于其他开发人员来说,这似乎是一次令人沮丧的经历。@jonrsharpe我使用的库在所有
print
调用中都会通过
end=“”
,我需要它用
end='\r\n'
调用
print
,因为目前格式已被破坏。库是什么?@Neil AWS Sagemaker,下面是一个示例:听起来您需要对场景进行
函数重载
——谢谢。我知道这是由我的设置引起的,即容器和自定义python repl。不过,这似乎是解决问题的最简单方法。@rfg:向janky设置添加更多jank不太可能长期减少您遇到的问题。谢谢。我知道这是由我的设置引起的,即容器和自定义python repl。不过,这似乎是解决问题的最简单方法。@rfg:向janky设置添加更多jank不太可能长期减少您遇到的问题数量。