(Python2) 'NoneType' has no attribute __getitem__


(arekk-99) #1

Witajcie!
Otóż mam dziwny problem. Pracuję obecnie nad forkiem pewnego klienta twittera dla osób niewidomych działającym na Linuksie i Windowsie. Po zmienieniu opcji na Windowsie w tym kliencie… Zresztą tak naprawdę nie zmieniłem nic. Otworzyłem tylko opcje programu by sprawdzić, czy mi się pojawia okienko i dałem OK. Wyłączyłem i próbowałem ponownie uruchomić aplikację, ale dostaje błąd jak w tytule w linijce sczytującej soundpack z configu.
Plik twitter.py funkcja init

def Setup():
global events
events=[]
global soundpack
soundpack=config.appconfig[‘general’][‘soundpack’]
streaming=0
global footer
footer=config.appconfig[‘general’][‘footer’]
auth=tweepy.OAuthHandler(tw1, tw2)
if config.appconfig[“general”][“TWKey”]=="" or config.appconfig[“general”][“TWSecret”]=="":
webbrowser.open(auth.get_authorization_url())
verifier = ask.ask(message=‘Enter pin:’)
auth.get_access_token(verifier)
config.appconfig[“general”][“TWKey”]=auth.access_token
config.appconfig[“general”][“TWSecret”]=auth.access_token_secret
config.appconfig.write()
else:
auth.set_access_token(config.appconfig[“general”][“TWKey”], config.appconfig[“general”][“TWSecret”])
global api
api = tweepy.API(auth)
global listener
global listener2
listener=StreamListener()
listener2=ReplyListener()
global screenname
m=api.me()
screenname=m.screen_name
global Stream
global Stream2
Stream = tweepy.Stream(auth = api.auth, listener=listener)
Stream2 = tweepy.Stream(auth = api.auth, listener=listener2)
snd.play(“welcome”)
gui.interface.spawn()

Nie wiem, czy te znaczniki dodały się w odpowiedni sposób, z góry przepraszam, jeśli coś jest nie tak. Błąd występuje w linijce soundpack=config.appconfig[‘general’][‘soundpack’]
Liczę na jakąkolwiek pomoc i z góry dizękuję.


(Razi) #2

W dużym skrócie, próbujesz wywołać coś na None.
Jest tam trochę użyć __getitem__ (generalnie każdy []), więc albo config.appconfig jest None, albo config.appconfig['general'] jest None. Wyprintuj oba. I przeczytaj dokładnie instrukcję uruchomienia, czasami trzeba coś jeszcze dorobić, jakieś pliki konfiguracyjne, nie orientuję się w tej bibliotece


(arekk-99) #3

Z tym, że to się dzieje wyłącznie, jak zmienie lub nie jakieś ustawienia. Domyślnie sobie tworzy, a jak coś edytuję w opcjach w programie, najczęściej dzieje się to właśnie przy parametrze soundpack, to się wszystko sypie.
to jest klasa robiąca teoretycznie to, co potrzeba.

from configobj import ConfigObj, ParseError
from validate import Validator, ValidateError
import os
import string
from logging import getLogger
log = getLogger(“config_utils”)

class ConfigLoadError(Exception): pass

def load_config(config_path, configspec_path=None, *args, **kwargs):
if os.path.exists(config_path):
clean_config(config_path)
spec = ConfigObj(configspec_path, encoding=‘UTF8’, list_values=False, _inspec=True)
try:
config = ConfigObj(infile=config_path, configspec=spec, create_empty=True, encoding=‘UTF8’, *args, **kwargs)
except ParseError:
raise ConfigLoadError(“Unable to load %r” % config_path)
validator = Validator()
validated = config.validate(validator, preserve_errors=False, copy=True)
if validated == True:
config.write()
return config
else:
log.exception(“Error in config file: {0}”.format(validated,))

def is_blank(arg):
"Check if a line is blank."
for c in arg:
if c not in string.whitespace:
return False
return True

def get_keys(path):
"Gets the keys of a configobj config file."
res=[]
fin=open(path)
for line in fin:
if not is_blank(line):
res.append(line[0:line.find(’=’)].strip())
fin.close()
return res

def hist(keys):
"Generates a histogram of an iterable."
res={}
for k in keys:
res[k]=res.setdefault(k,0)+1
return res

def find_problems(hist):
"Takes a histogram and returns a list of items occurring more than once."
res=[]
for k,v in hist.items():
if v>1:
res.append(k)
return res

def clean_config(path):
“Cleans a config file. If duplicate values are found, delete all of them and just use the default.“
orig=[]
cleaned=[]
fin=open(path)
for line in fin:
orig.append(line)
fin.close()
for p in find_problems(hist(get_keys(path))):
for o in orig:
o.strip()
if p not in o:
cleaned.append(o)
if len(cleaned) != 0:
cam=open(path,‘w’)
for c in cleaned:
cam.write©
cam.close()
return True
else:
return False

plik app.defaults, który generuje domyślny config.

[general]
TWKey = string(default=””)
TWSecret = string(default="")
soundpack = string(default=“default”)
soundvol = float(default=1)
footer = string(default="")
dmnotify = float(default=1)
lng = string(default=“default.lng”)