用于传递文件路径、文件名或文件对象的Python约定

用于传递文件路径、文件名或文件对象的Python约定,python,Python,我经常看到Python代码接受各种输入 文件名 s = Something("/Users/me/my_file.txt") 文件路径 s = Something("my_file.txt") 或文件对象 f = open("my_file.txt", "r") s = Something(f) 这有约定吗? 正如很多人提到的,这取决于什么是something()。哪些情况更适合文件名与文件对象 我不知道这篇文章是否给出了最好的答案 这一切都取决于Something()的接口。我不知道这样

我经常看到Python代码接受各种输入

文件名

s = Something("/Users/me/my_file.txt")
文件路径

s = Something("my_file.txt")
或文件对象

f = open("my_file.txt", "r")
s = Something(f)
这有约定吗? 正如很多人提到的,这取决于什么是
something()
。哪些情况更适合文件名与文件对象


我不知道这篇文章是否给出了最好的答案

这一切都取决于
Something()
的接口。我不知道这样说是否公平,因为这有一个严格的惯例。duck类型的好处在于,您不需要知道函数参数的类型,只需要知道参数的某些行为方式。

有两种加载数据的方法:
json.load
采用类似文件的对象,而
json.load
采用字符串:

>>> json.load(open("my_file.json"))
[1, 2]
>>> json.loads("[1, 2]")
[1, 2]
模块有一个类似的接口(一个接受文件对象,另一个接受字符串)

本质上,API主要使用文件对象,并且提供了一种方便的方法,将提供的字符串封装在一个文件中。可能看起来像这样:

class Parser(object):
    def __init__(self, fh):
        # Can do things like:
        first_line = fh.readline()
        fh.seek(0)
        all_content = fh.read()


def parse(fh):
    return Parser(fh)


def parse_str(inputstring):
    fh = StringIO.StringIO(inputstring)
    return Parser(fh)

它认为没有任何适用的公约。这完全取决于您的程序想要实现什么。

这取决于
something()
在做什么,它是否在检查传递的参数类型。几乎所有地方,裸文件名“foo”都与更显式的路径“/foo”相同,所以实际上只有两种情况:路径和对象。问得好,我想我现在是在抽象地思考。也许惯例是设计两个接口,让用户决定传入的类型,调用适当的方法,而不是给他们一个接口并在幕后检查类型?