Skip to content
Advertisement

Linkrot – TypeError: ‘<' not supported between instances of 'NoneType' and 'str'

I’m getting a “TypeError: ‘<‘ not supported between instances of ‘NoneType’ and ‘str'” when running a python script. Below is the Traceback.

Traceback (most recent call last):
File "c:python38librunpy.py", line 193, in _run_module_as_main
return _run_code(code, main_globals, None,
File "c:python38librunpy.py", line 86, in run_code
exec(code, run_globals)
File "C:Python38Scriptslinkrot.exe_main.py", line 7, in
File "c:python38libsite-packageslinkrotcli.py", line 215, in main
text = get_text_output(pdf, args)
File "c:python38libsite-packageslinkrotcli.py", line 126, in get_text_output
for k, v in sorted(pdf.get_metadata().items()):
TypeError: '<' not supported between instances of 'NoneType' and 'str'.

Here is the snippet of the code throwing the error. I understand why it is wrong, but I’m unsure how to fix it. Any help would be appreciated.

def get_text_output(pdf, args):
    """ Normal output of infos of linkrot instance """
    # Metadata
    ret = ""
    ret += "Document infos:n"
    for k, v in sorted(pdf.get_metadata().items()):
        if v:
            ret += "- %s = %sn" % (k, parse_str(v).strip("/"))

    # References
    ref_cnt = pdf.get_references_count()
    ret += "nReferences: %sn" % ref_cnt
    refs = pdf.get_references_as_dict()
    for k in refs:
        ret += "- %s: %sn" % (k.upper(), len(refs[k]))

    if args.verbose == 0:
        if "pdf" in refs:
            ret += "nPDF References:n"
            for ref in refs["pdf"]:
                ret += "- %sn" % ref
        elif ref_cnt:
            ret += "nTip: You can use the '-v' flag to see all referencesn"
    else:
        if ref_cnt:
            for reftype in refs:
                ret += "n%s References:n" % reftype.upper()
                for ref in refs[reftype]:
                    ret += "- %sn" % ref

    return ret.strip()

Advertisement

Answer

It appears None is one of the dictionary keys. Since the sort method uses comparison to sort the dictionary by keys, it fails because it cannot compare this None to the other keys that are strings (thus the error message that talks about a comparison operator <).

Assuming the None key is there by accident and doesn’t contain any useful data, you can solve this by simply removing it from the dictionary before the for loop like this:

metadata = pdf.get_metadata()
metadata.pop(None, None)
for k, v in sorted(metadata.items()):
    ...
Advertisement