用python和statement作对?

2024-06-16 16:37:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我不确定这是否是“良好的python实践”,但是否可以定义一个自定义文件对象,该对象可以执行以下操作:

myfile = myopen('myfile.txt')
with myfile:
    write('Hello World!') #notice we don't put "myfile.write(..)" here!

也就是说,文件上下文创建了一个函数“write()”,这样我们就不必键入我的文件.write(..)等。它节省了打字,在某些情况下使目的更清楚。例如:

^{pr2}$

与之相反

myboard = ChessBoard()
with ChessBoard():
    make_move("e4",board=myboard)
    make_move("e5",board=myboard)
    give_up(board=myboard)

问题是:我应该这样做吗?我该怎么做呢?我想我得修改globals()-dict,但这似乎是个坏主意。。在

编辑:好的,谢谢!我得到了很多好的答案,建议我不要这样做。所以我不会这么做:o)


Tags: 文件对象boardtxthelloworldmovemake
3条回答

首先,这根本不是个好主意。显式比隐式好——明确提到董事会、读者(几周后可能就是你!)可以立即判断出正在操作哪个板。而且,没有必要。您可以通过其他方式获得更方便的语法:例如,使函数成为单个对象的方法。并删除无意义的上下文管理器(它应该做什么?你已经预先创建了一个对象。在

为此,您需要全局状态,但不需要globals。比方说,一个全局(确切地说是模块级)对象堆栈,上下文管理器推送并弹出对象,各个函数查看堆栈的顶部。事实上,如果你知道你的东西,其实并不难实现,但正如我之前所说,没有理由这么做。在

您可能认为需要修改globals()。但是,如果您在不同的模块中定义了上下文管理器,那么您将使用定义它的模块的全局参数。不是使用它的模块。因此,您需要在__builtin__命名空间(内置函数所在的地方)中定义方法。这当然可以做到,但我觉得这是一个更糟糕的想法,尤其是如果您想将其用于任意对象。如果你以某种方式弄乱了名字(例如,加一个前导下划线),也许。但即便如此,如果嵌套with语句呢?在

{Basic的Python和你看到的不是一样的。也就是说,一个相当于Pascal/VB with语句的Python将是一件很好的事情;它只是不能被称为with。在

这不是上下文管理器的目的,正如前面所说的,我打破了“显性优于隐性”的原则。要使其发挥作用,唯一的方法就是围绕Python的组合语义工作,这是Python的一个优点。如果只有一个方法可以多次调用,那么要保存键入,可以做的是:

move = ChessBoard().make_move
move("e4")
move("e5")

或采用多种方法:

^{pr2}$

(在FP术语中,这实际上是部分应用程序,而不是当前应用程序。)

相关问题 更多 >