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

Python 接收文件对象或文件路径

Python 接收文件对象或文件路径,python,Python,我知道在静态语言中,接收文件对象总是比接收表示路径的字符串更好(从软件设计的角度来看)。然而,在像python这样的动态语言中,您看不到变量的类型,传递文件的“正确”方式是什么 传递函数对象不是有问题吗,因为您需要记住在之后关闭它(因为您看不到类型,所以可能不会关闭它)您可以使用。当它们(自动)被垃圾收集时,该文件将为您关闭 文件对象是使用C的stdio包实现的,可以使用内置的open()函数创建 你可以用。当它们(自动)被垃圾收集时,该文件将为您关闭 文件对象是使用C的stdio包实现的,可以

我知道在静态语言中,接收文件对象总是比接收表示路径的字符串更好(从软件设计的角度来看)。然而,在像python这样的动态语言中,您看不到变量的类型,传递文件的“正确”方式是什么

传递函数对象不是有问题吗,因为您需要记住在之后关闭它(因为您看不到类型,所以可能不会关闭它)

您可以使用。当它们(自动)被垃圾收集时,该文件将为您关闭

文件对象是使用C的stdio包实现的,可以使用内置的open()函数创建

你可以用。当它们(自动)被垃圾收集时,该文件将为您关闭

文件对象是使用C的stdio包实现的,可以使用内置的open()函数创建


理想情况下,无论何时打开文件,都将使用with语句,因此关闭将由该语句处理

with open('filepath', 'r') as f:
    myfunc(f)

otherstuff() # f is now closed
从:

在处理文件时,最好使用with关键字 物体。这样做的好处是,文件在关闭后会正确关闭 它的套件完成了,即使在途中出现了异常


理想情况下,无论何时打开文件,都将使用with语句,因此关闭将由该语句处理

with open('filepath', 'r') as f:
    myfunc(f)

otherstuff() # f is now closed
从:

在处理文件时,最好使用with关键字 物体。这样做的好处是,文件在关闭后会正确关闭 它的套件完成了,即使在途中出现了异常

但是,在python这样的动态语言中,您无法看到 变量类型,传递文件的“正确”方式是什么?

简单的回答是——你没有

在大多数面向对象语言中,都有一个对象契约,它保证如果对象有一个方法
嘎嘎
,它就知道如何嘎嘎。有些语言在执行此契约时非常严格(例如Java),而其他语言则不太严格

最后,它归结为Python的一个原则:

Ep终止更适合ask。这是一条常见的Python 编码样式假定存在有效的键或属性,并且 如果假设被证明是错误的,则捕获异常。这件衣服又干净又快 风格的特点是有许多尝试和例外 声明。这项技术与许多人常见的LBYL风格形成对比 其他语言,如C

LBYL=三思而后行

这意味着,如果您的方法需要一个“文件”(并且您在文档中声明了这一点),则假定您正在被传递一个“类似文件的对象”。尝试对对象执行文件操作(如
read()
close()
),然后捕获引发的异常

EAFP方法的一个要点是,您可能会得到一个像文件一样工作的对象,换句话说,调用者知道他们在做什么。所以,如果你花时间检查确切的类型,你会发现代码在应该的时候不起作用。现在,调用者的负担是满足您的“对象契约”;但是,如果它们不是使用文件而是使用内存缓冲区(与文件具有相同的方法),该怎么办?或者请求对象(同样,具有相同的类似文件的方法)。您不可能检查代码中的所有这些变体

这是首选方法,而不是LBYL方法,后者首先是类型检查

因此,如果您的方法的文档声明它需要一个文件对象,那么它应该处理任何“类似文件”的对象,但是当有人将字符串传递给文件路径时,您的方法应该引发相应的异常

而且,更重要的是,您应该避免在方法中关闭对象;因为它可能不像前面解释的那样是一个“文件”。但是,如果您确实必须这样做,请确保方法的文档非常清楚地说明了这一点

以下是一个例子:

def my_method(fobj):
    ''' Writes to fobj, which is any file-like object,
        and returns the object '''
    try:
        fobj.write('The answer is: {}\n'.format(42))
    except (AttributeError, TypeError):
        raise TypeError('Expected file-like object')
    return fobj
但是,在python这样的动态语言中,您无法看到 变量类型,传递文件的“正确”方式是什么?

简单的回答是——你没有

在大多数面向对象语言中,都有一个对象契约,它保证如果对象有一个方法
嘎嘎
,它就知道如何嘎嘎。有些语言在执行此契约时非常严格(例如Java),而其他语言则不太严格

最后,它归结为Python的一个原则:

Ep终止更适合ask。这是一条常见的Python 编码样式假定存在有效的键或属性,并且 如果假设被证明是错误的,则捕获异常。这件衣服又干净又快 风格的特点是有许多尝试和例外 声明。这项技术与许多人常见的LBYL风格形成对比 其他语言,如C

LBYL=三思而后行

这意味着,如果您的方法需要一个“文件”(并且您在文档中声明了这一点),则假定您正在被传递一个“类似文件的对象”。尝试对对象执行文件操作(如
read()
close()
),然后捕获引发的异常

EAFP方法的一个要点是,您可能会得到一个像文件一样工作的对象,换句话说,调用者知道他们在做什么。所以,如果你花时间检查确切的类型,你会发现代码在应该的时候不起作用。现在,调用者的负担是满足您的“对象契约”;但是,如果它们不是使用文件而是使用内存缓冲区(与文件具有相同的方法),该怎么办?或者请求对象(同样,具有相同的类似文件的方法)。你不可能全部检查
def f():
    return open(filepath, 'w') # returns file object

ofs = f()
ofs.write('something')
ofs.close()