gpt4 book ai didi

python - 如何接受文件或路径作为python中方法的参数

转载 作者:行者123 更新时间:2023-11-28 21:27:36 25 4
gpt4 key购买 nike

我正在尝试编写一种方法来接受打开的文件

myFile = open("myFile.txt")
obj.writeTo(myFile)
myFile.close()

或带有路径的字符串
obj.writeTo("myFile.txt")

该方法实现如下:
def writeTo(self, hessianFile):
if isinstance(hessianFile,file):
print("File type")
elif isinstance(hessianFile,str):
print("String type")
else:
pass

但这会引发错误
NameError: global name 'file' is not defined

为什么没有定义文件类型?不应该一直定义文件吗?应该如何更正实现以正确处理文件作为有效参数类型的两个路径

最佳答案

不要打字检查!它不是 Pythonic。鸭子打字的核心是这样的想法,如果它像鸭子一样嘎嘎叫,那就是鸭子。你想要的行为是,如果它是类似文件的,它可以工作,如果它是类似字符串的,它就可以工作。这不仅仅是意识形态 - 因为这是 Python 中的标准,人们希望能够为您提供一个类似文件的对象并使其工作。如果您将其限制为仅特定文件类型,您的代码将变得脆弱且不灵活。

最简单的选择是简单地选择更常见的结果,尝试按照您的方式工作,如果遇到异常,则无法使用其他方法:

def writeTo(self, hessianFile):
try:
with open(hessianFile, "w") as f:
do_stuff(f)
except TypeError:
do_stuff(hessianFile)

如果您习惯于“使用异常进行流控制”被认为不好的其他语言,这可能看起来很糟糕,但在 Python 中情况并非如此,因为它们是经常以这种方式使用的语言的核心部分(每个 for 循环以异常(exception)结束!)。

或者,如果您认为在大多数情况下更有可能获得文件对象,请反过来做:
def writeTo(self, hessianFile):
try:
do_stuff(f)
except AttributeError:
with open(hessianFile, "w") as f:
do_stuff(f)

注意我使用 the with statement这是处理打开文件的最佳方式 - 它更具可读性,并且始终为您关闭文件,即使在异常情况下也是如此。

如果您真的发现必须键入检查(例如:即使失败,操作也非常昂贵,无法短路),您应该检查字符串侧,因为如果某些内容是字符串,则更容易确定 - like 与 file-like 相对。如果你必须检查类似文件的东西,你应该实现一个 abstract base class并寻找您需要的功能,而不是实际进行类型检查。

您的原始代码失败的原因是 file不是 open() 返回的对象的基类在 3.x.

The type of file object returned by the open() function depends on the mode. When open() is used to open a file in a text mode ('w', 'r', 'wt', 'rt', etc.), it returns a subclass of io.TextIOBase (specifically io.TextIOWrapper). When used to open a file in a binary mode with buffering, the returned class is a subclass of io.BufferedIOBase. The exact class varies: in read binary mode, it returns a io.BufferedReader; in write binary and append binary modes, it returns a io.BufferedWriter, and in read/write mode, it returns a io.BufferedRandom. When buffering is disabled, the raw stream, a subclass of io.RawIOBase, io.FileIO, is returned. Source



所以你想要 io.FileIO .

关于python - 如何接受文件或路径作为python中方法的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10692663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com