使用 ast 时出现类型错误

Posted

技术标签:

【中文标题】使用 ast 时出现类型错误【英文标题】:TypeError while using ast 【发布时间】:2021-09-06 22:56:16 【问题描述】:

我正在尝试使用 ast 阅读我的字典(在我的文件中)

import ast
import os

class just_a_class():
    def __init__(self, file,):
        self.file = file()
        self.read_file = open(self.file,'r+')

    def read_file(self):
        dict = ast.literal_eval(self.read_file.read())
        return 'Input: \n\n '.format(dict)

the_class = just_a_class("dict.txt")
print(the_class.self.read_file())

错误:

Traceback (most recent call last):
File "c:/Users/Barış/Desktop/Onemli_Programlarim/Connection_PL/conn.py", line      13, in <module>
the_class = just_a_class("dict.txt")
File "c:/Users/Barış/Desktop/Onemli_Programlarim/Connection_PL/conn.py", line 6, in __init__
self.file = file()
TypeError: 'str' object is not callable

【问题讨论】:

self.file = file() 删除那里的括号,filestr,你不应该调用它 而且最好在完成后关闭打开的文件,最好不要给与Python内置冲突的变量命名,即@987654327 @ 这里(语法高亮也有帮助...) 我认为错误回溯本身的答案很清楚 - “TypeError: 'str' object is not callable”,第 6 行。您正在尝试将字符串(文件)作为函数调用(文件())。正如@Altareos 所述,您需要将其替换为 self.file = file 次要旁注:您不希望在此处使用模式 "r+"。您从文件中读取,从不写入,因此打开文件进行读取和写入是一种浪费,并且存在行为不当的风险,因为以读取它为目的而打开的文件现在也可能被意外写入。 【参考方案1】:

下面的代码类似于问题中使用的代码。我试过了 通过使用常见的技术和约定来提高可读性, 例如使用fname 作为文件名,而不是file,使用 上下文管理器来打开(和自动关闭)文件,以及大小写 对于类名。还将标志更改为 open() 调用为“r” 而不是 ShadowRanger 建议的“r+”。

import ast

class Just_a_class():
    def __init__(self, fname):
        self.fname = fname
    def read_file(self):
        with open(self.fname, 'r') as f:
            dict = ast.literal_eval(f.read())
        return 'Input: \n\n '.format(dict)

the_class = Just_a_class("dict.txt")
print(the_class.read_file())
# 'a': 5, 'b': 'hello'

【讨论】:

虽然这在技术上修复了代码,但它有点跳过了为什么它首先被破坏,同时进行了其他更改,使其不清楚实际问题(而不是糟糕的样式/设计)是什么在原始代码中。 @ShadowRanger:是的,我同意你的结论,但我不清楚如何描述修复背后的所有原因。我想我会尝试对其进行总结,然后展示能够捕捉原始代码中主要主题的工作代码。感谢您提供有关“r+”的提示;我没发现那个。

以上是关于使用 ast 时出现类型错误的主要内容,如果未能解决你的问题,请参考以下文章

hibernate查询中使用nolock时出现识别错误

使用 NavigationLink() 时出现“类型 '[view]' 不能符合 'View'”错误

尝试使用函数对参数求和时出现类型错误

当我将 IterativeImputer 与 KNeighborsClassifier 一起使用时出现错误“未知标签类型:'连续'”

不使用别名时出现FieldsConflict类型的graphql验证错误

将 Typescript 与 React-Redux 一起使用时出现类型错误