Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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 2.7 - Fatal编程技术网

如何重写python库的函数?

如何重写python库的函数?,python,python-2.7,Python,Python 2.7,我使用的是一个python库,需要重写其中一个函数。让我们将其称为module.py: def dump(nodes, args = 'bleh' ): ...validation checks for node in nodes: print(node, someother_args) def print_node(node, someother_args): ...prints in some way i don't want 现在,我正在使用这个dump方法,我想用

我使用的是一个python库,需要重写其中一个函数。让我们将其称为module.py:

def dump(nodes, args = 'bleh' ):
  ...validation checks
  for node in nodes:
    print(node, someother_args)

def print_node(node, someother_args):
  ...prints in some way i don't want

现在,我正在使用这个
dump
方法,我想用我自己的
print\u node
方法覆盖
print\u node
函数,因为我想以不同的方式打印它。最好的方法是什么?

您可以自己创建一个从预期模块继承的类,并以任何方式重写函数。然后可以使用对象而不是
module.py

class my_class(module):
    def __init__(self, *args, **kwargs):
        super(my_class, self).__init__(*args, **kwargs)
    def dump(self):
        # do stuff
正如您在评论中提到的,如果您的模块包含一组函数,那么您最好在当前模块中定义新函数。然后您可以将其分配给该函数名

正如@Joran Beasley也提到的,你可以做如下事情

import my_file
my_file.dump = my_local_dump_fn

请注意,您已经用python2.7对其进行了标记,在2.7中,print不是一个函数。您可以从文件顶部的future导入print_函数来更改它(它在python3中被更改为函数,部分原因是),这是可行的,但几乎总是一个坏主意。@user2357112标题中的问题是一个坏主意,但paris实际上试图做的事情不是,在我看来,覆盖默认函数可能会导致可维护性问题,但想要一个自定义打印函数并不坏——我只是给它取了个不同的名字,例如,打印和写入日志的打印和日志可能非常有用哦,对不起,@en\u Knight你说得对。这是该库的print_节点函数,而不是python的默认打印函数。您要做的就是所谓的monkey patching。查一下,那个模块没有类。这只是一堆函数。在这种情况下,您可以不在当前模块中定义新函数。然后您可以将其分配给该函数名。
导入我的_文件
my_file.dump=my_local\u dump\u fn
在完成此操作后导入此方法的任何位置都应获得覆盖的函数…@Jordan Beasley,是的,这项工作很有效。但是,我使用的是dump函数,它使用print_节点函数。dump执行一些验证检查和arg操作。我只是想改变打印节点的功能,好吧,我明白了,这样我就可以导入我的打印文件了;my_file.print_node=my_local_print_node。谢谢