Ошибка интерпретатора Python: «AttributeError: у объекта списка нет атрибута split» - PullRequest
0 голосов
/ 11 ноября 2018

Я делал язык программирования на Python 3.6, когда наткнулся на что-то странное. С помощью следующего кода я получаю ошибку с интересным выводом.

import sys
import tkinter as tk
import datetime

class _Viper:
    def __init__(self):
        pass
    def error(self, err, title="ERROR"):
        root = tk.Tk()
        root.title(title)
        root["bg"] = "#d56916"
        label = tk.Label(root, text=err)
        labelt = tk.Label(root, text=str(datetime.datetime.now()))
        label.config(bg="#e67a27")
        labelt.config(bg="#d56916")
        label.grid()
        labelt.grid()
        root.mainloop()
    def grabdata(self, line):
        raw = line.split("(")
        raw[1] = raw[1][:-1]
        print(type(raw[1]))
        raw[1] = raw[1].split()
        #raw[1] = raw[1].split('"')
        return {
            "keyword" : raw[0],
            "params"  : raw[1].split()
        }

Viper = _Viper() #For PyLint
"""
try:
    sys.argv[1]
    execute = True
except:
    execute = False
    Viper.error("Error `Viper.FileNotProvidedError` @ interpreter.py. Do not directly run this file. Run it with `Viper0.0.0a C:\\path\\to\\file`, or associate viper to Viper0.0.0a.bat.")
"""

sys.argv.append("C:\\viper\\interpreter\\testie.vi")
execute = True

if execute:
    extension = str(sys.argv[1][-2]+sys.argv[1][-1])
    if extension.upper() == "VI":
        with open("C:\\viper\\interpreter\\testie.vi", "r") as src:
            lines = src.readlines()
        for line in lines:
            Viper.grabdata(line)
    else:
        Viper.error("Error `Viper.ExtensionNotViperError` @ interpreter.py. Please run this with a file with the \"vi\" extension.")

После запуска я получаю эту ошибку. Error

Вы видите то, что я вижу? <class 'str'> это класс raw[1]. Здесь пусто. Но когда я ссылаюсь на него после, он говорит, что это список!

Может кто-нибудь сказать мне, что здесь происходит?

EDIT

Я забыл добавить файл viper.

setvar("hmm", "No")

РЕДАКТИРОВАТЬ 2

Я собираюсь объяснить мою проблему. Он обрабатывает строку как список .

1 Ответ

0 голосов
/ 11 ноября 2018

Строка после печати типа:

 raw[1] = raw[1].split()

Это превращает его в список.Когда вы звоните raw[1] позже с "params" : raw[1].split(), это уже не строка, а список.Так что это означает, что raw[1] делится дважды.Если вы намереваетесь вернуть параметры в raw[1] в виде списка, вы можете просто удалить строку raw[1] = raw[1].split().

...