【问题标题】:python: where is a true built-in file object required?python:真正的内置文件对象在哪里需要?
【发布时间】:2011-08-26 02:30:27
【问题描述】:

来自urllib.urlopen() 上的python 文档,谈到函数成功返回的类文件对象:

(但它不是内置文件对象,因此不能在需要真正内置文件对象的少数地方使用。)

哪些地方需要真正的内置文件对象?

注意:这纯粹是出于好奇……这里没有要解决的实际问题。

【问题讨论】:

  • 我猜 Python 违反了它自己的管道类型规则? >=D
  • “管道打字”?通常的拼写是“duck typing”。
  • 如果你想看到我们违反了鸭子类型,请尝试使用不继承自 str(或 2.x 中的 unicode)的类字符串类型。

标签: python api file interface standard-library


【解决方案1】:

例如,f.fileno() 不一定会返回您可以与 os.read() 一起使用的真正的操作系统级文件描述符。

【讨论】:

  • 但它应该。来自docs:“注意没有真正文件描述符的类文件对象不应该提供这种方法!”
【解决方案2】:

subprocess 模块中的东西需要一个具有fileno 可调用属性的文件对象,用于stdinstdoutstderr,其中only files with a file descriptor (real files) should implementisatty()也应该只在真实文件中实现,但不知道在哪里需要。

【讨论】:

    【解决方案3】:

    正如其他答案所指出的那样,实际上并没有任何地方特别需要 file 对象,但是有些接口需要真正的操作系统级别的文件描述符,类似于文件的对象StringIO无法提供。

    os 模块有几种直接操作文件描述符的方法,selectmmap 模块也是如此。一些更高级别的模块依赖于底层模块,因此在处理不支持 fileno() 方法的类文件对象时可能会出现一些限制。

    不过,我不知道有任何关于这些限制的一致文档(除了接受数字文件描述符而不是对象的明显 API 之一)。更多的是“尝试一下,看看它是否有效”。如果事情不起作用,那么这就是你要记住的事情,以检查是否可能是罪魁祸首(特别是如果像 "no attribute named 'fileno'""invalid file descriptor" 这样的短语出现在任何相关的错误消息中)。

    【讨论】:

    • 乐趣不止于此:例如,并非所有类似文件的对象(甚至“文件”——想想 FIFO/命名管道)都支持查找。
    • 是的。我认为这是没有人尝试全面记录可以在哪里使用的主要原因 - 您需要的界面的哪些部分在很大程度上取决于您实际在做什么。
    猜你喜欢
    • 2020-01-02
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多