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不太可能长期减少您遇到的问题数量。