'NoneType' object has no attribute 'decode'

这一生的挚爱 提交于 2021-01-29 08:31:46

问题


I practice writing some code to get top repositories of Python from GitHub and this is the error I see:

this is the code which causes above stated error:

import requests 
import pygal
from pygal.style import LightColorizedStyle as LCS, LightenStyle as LS


path = 'https://api.github.com/search/repositories?q=language:python&sort=stars'

r = requests.get(path)

response_dict = r.json()

# Explore information about the repositories.
repo_dicts = response_dict['items']

names, plot_dicts = [], []
for repo_dict in repo_dicts:
    names.append(repo_dict['name'])
    plot_dict = {
        'value': repo_dict['stargazers_count'],
        'label': repo_dict['description'],
        'xlink': repo_dict['html_url'],
    }
    plot_dicts.append(plot_dict)

my_style = LS('#333366', base_style=LCS)
# Make visualization.
my_config = pygal.Config()
chart = pygal.Bar(my_config, style=my_style)


my_style = LS('#333366', base_style=LCS)
chart.title = 'Most-Starred Python Projects on GitHub'
chart.x_labels = names

chart.add('', plot_dicts)
chart.render_to_file('python_repos.svg')

Can you help me with this please. Thank you


回答1:


There seems to be a None value somewhere where a string is expected, and the traceback seems to show it is the label value.

Try to change this:

plot_dict = {
    'value': repo_dict['stargazers_count'],
    'label': repo_dict['description'],
    'xlink': repo_dict['html_url'],
}

To this:

plot_dict = {
    'value': repo_dict['stargazers_count'],
    'label': repo_dict['description'] or "",
    'xlink': repo_dict['html_url'],
}



回答2:


I looked at your code. It looks like some links have no label (so they are of type None) See here. _compat.py then tries to invoke the method decode ("utf-8") on a None-Type, which leads to the corresponding crash.

I recommend all entries in plot_dicts that have no label to be labeled with an empty string like shown in the code below. The code below works for me.

import requests
import pygal
from pygal.style import LightColorizedStyle as LCS, LightenStyle as LS


path = 'https://api.github.com/search/repositories?q=language:python&sort=stars'

r = requests.get(path)

response_dict = r.json()

# Explore information about the repositories.
repo_dicts = response_dict['items']

names, plot_dicts = [], []
for repo_dict in repo_dicts:
    names.append(repo_dict['name'])
    plot_dict = {
        'value': repo_dict['stargazers_count'],
        'label': repo_dict['description'],
        'xlink': repo_dict['html_url'],
    }
    plot_dicts.append(plot_dict)

my_style = LS('#333366', base_style=LCS)
# Make visualization.
my_config = pygal.Config()
chart = pygal.Bar(my_config, style=my_style)


my_style = LS('#333366', base_style=LCS)
chart.title = 'Most-Starred Python Projects on GitHub'
chart.x_labels = names

# preprocess labels here
def f(e):
    if e['label'] is None:
        e['label'] = ""
    return e
plot_dicts = list(map(f, plot_dicts))


chart.add('', plot_dicts)
chart.render_to_file('python_repos.svg')

Maybe you find a better way to map the list but that definitely works.



来源:https://stackoverflow.com/questions/56890528/nonetype-object-has-no-attribute-decode

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!