How to convert Nonetype to int or string?

前端 未结 10 1964
情歌与酒
情歌与酒 2020-11-29 17:23

I\'ve got an Nonetype value x, it\'s generally a number, but could be None. I want to divide it by a number, but Python raises:

<
相关标签:
10条回答
  • 2020-11-29 18:04

    In some situations it is helpful to have a function to convert None to int zero:

    def nz(value):
    
        '''
        Convert None to int zero else return value.
        '''
    
        if value == None:
            return 0
        return value
    
    0 讨论(0)
  • 2020-11-29 18:07

    This can happen if you forget to return a value from a function: it then returns None. Look at all places where you are assigning to that variable, and see if one of them is a function call where the function lacks a return statement.

    0 讨论(0)
  • 2020-11-29 18:10

    In Python 3 you can use the "or" keyword too. This way:

    foo = bar or 0
    foo2 = bar or ""
    
    0 讨论(0)
  • 2020-11-29 18:10

    I was having the same problem using the python email functions. Below is the code I was trying to retrieve email subject into a variable. This works fine for most emails and the variable populates. If you receive an email from Yahoo or the like and the sender did no fill out the subject line Yahoo does not create a subject line in the email and you get a NoneType returned from the function. Martineau provided a correct answer as well as Soviut. IMO Soviut's answer is more concise from a programming stand point; not necessarily from a Python one. Here is some code to show the technique:

    import sys, email, email.Utils 
    
    afile = open(sys.argv[1], 'r')    
    m = email.message_from_file(afile)    
    subject = m["subject"]
    
    # Soviut's Concise test for unset variable.
    
    if subject is None:    
         subject = "[NO SUBJECT]"
    
    # Alternative way to test for No Subject created in email (Thanks for NoneThing Yahoo!)
    
    try:    
        if len(subject) == 0:    
            subject = "[NO SUBJECT]"
    
    except TypeError:    
        subject = "[NO SUBJECT]"
    
    print subject
    
    afile.close()
    
    0 讨论(0)
  • 2020-11-29 18:13

    In one of the comments, you say:

    Somehow I got an Nonetype value, it supposed to be an int, but it's now a Nonetype object

    If it's your code, figure out how you're getting None when you expect a number and stop that from happening.

    If it's someone else's code, find out the conditions under which it gives None and determine a sensible value to use for that, with the usual conditional code:

    result = could_return_none(x)
    
    if result is None:
        result = DEFAULT_VALUE
    

    ...or even...

    if x == THING_THAT_RESULTS_IN_NONE:
        result = DEFAULT_VALUE
    else:
        result = could_return_none(x) # But it won't return None, because we've restricted the domain.
    

    There's no reason to automatically use 0 here — solutions that depend on the "false"-ness of None assume you will want this. The DEFAULT_VALUE (if it even exists) completely depends on your code's purpose.

    0 讨论(0)
  • 2020-11-29 18:16

    A common "Pythonic" way to handle this kind of situation is known as EAFP for "It's easier to ask forgiveness than permission". Which usually means writing code that assumes everything is fine, but then wrapping it with a try...except block to handle things—just in case—it's not.

    Here's that coding style applied to your problem:

    try:
        my_value = int(my_value)
    except TypeError:
        my_value = 0  # or whatever you want to do
    
    answer = my_value / divisor
    

    Or perhaps the even simpler and slightly faster:

    try:
        answer = int(my_value) / divisor
    except TypeError:
        answer = 0
    

    The inverse and more traditional approach is known as LBYL which stands for "Look before you leap" is what @Soviut and some of the others have suggested. For additional coverage of this topic see my answer and associated comments to the question Determine whether a key is present in a dictionary elsewhere on this site.

    One potential problem with EAFP is that it can hide the fact that something is wrong with some other part of your code or third-party module you're using, especially when the exceptions frequently occur (and therefore aren't really "exceptional" cases at all).

    0 讨论(0)
提交回复
热议问题