我正在尝试编写一个方法,该方法将接受打开的文件
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
为什么没有定义文件类型?文件不应该一直被定义吗?如何更正实现以正确地将文件的两个路径都作为有效的参数类型
Python 3中没有
file
类型。它在Python 2中是内置的,但在Python 3中消失了。比较以下内容:在Python 3中。。。
别打支票!不是Python。鸭子打字的核心是,如果它像鸭子一样呱呱叫,那它就是鸭子。您需要的行为是,如果它是类似于的文件,那么它可以工作;如果它是类似于的字符串,那么它可以工作。这不仅仅是意识形态上的——因为这是Python中的标准,人们希望能够给你一个类似文件的对象并让它工作。如果仅将其限制为特定的文件类型,则代码将脆弱且不灵活。
最简单的选择是简单地选择更常见的结果,并尝试按您的方式处理该结果,如果出现异常,则无法使用其他方法:
如果您习惯了“使用异常进行流控制”被认为是不好的其他语言,这可能看起来很糟糕,但在Python中却不是这样,因为它们是经常使用这种方式的语言的核心部分(每个for循环都以异常结束!)。
或者,如果您认为在大多数情况下更可能获得一个文件对象,请采用另一种方法:
注意我使用的the ^{} statement 这是处理打开文件的最好方法-它更可读,而且总是为您关闭文件,即使在出现异常时也是如此。
如果您发现您必须输入check(例如:即使操作失败,也没有短路的方法),那么您应该检查字符串端,因为它更容易确定是字符串类型的还是文件类型的。如果要检查类似的文件,则应该实现一个abstract base class,并查找所需的功能,而不是实际的类型检查。
原始代码失败的原因是
file
不是3.x中open()
返回的对象的基类所以你需要^{} 。
不要使用名称“file”(python中的内置对象)作为类文件对象的名称。
示例:
相关问题 更多 >
编程相关推荐