ctx['location_ids'] = vals['location_ids']
I have a large function so I will not post it here, but the problem is when vals['location_ids'] have values as integer everything works smooth, but sometimes there are no values in vals['location_ids'] so it is False, and when it is False I get error.
ctx['location_ids'] = vals['location_ids']
TypeError: 'bool' object has no attribute '__getitem__'
how can I avoid it, maybe add hasattr?
you should try to check first it's dictionary
if isinstance(vals, dict):
ctx['location_ids'] = vals.get('location_ids', None)
Related
I keep getting an error that says
AttributeError: 'NoneType' object has no attribute 'something'
The code I have is too long to post here. What general scenarios would cause this AttributeError, what is NoneType supposed to mean and how can I narrow down what's going on?
NoneType means that instead of an instance of whatever Class or Object you think you're working with, you've actually got None. That usually means that an assignment or function call up above failed or returned an unexpected result.
You have a variable that is equal to None and you're attempting to access an attribute of it called 'something'.
foo = None
foo.something = 1
or
foo = None
print(foo.something)
Both will yield an AttributeError: 'NoneType'
Others have explained what NoneType is and a common way of ending up with it (i.e., failure to return a value from a function).
Another common reason you have None where you don't expect it is assignment of an in-place operation on a mutable object. For example:
mylist = mylist.sort()
The sort() method of a list sorts the list in-place, that is, mylist is modified. But the actual return value of the method is None and not the list sorted. So you've just assigned None to mylist. If you next try to do, say, mylist.append(1) Python will give you this error.
The NoneType is the type of the value None. In this case, the variable lifetime has a value of None.
A common way to have this happen is to call a function missing a return.
There are an infinite number of other ways to set a variable to None, however.
Consider the code below.
def return_something(someint):
if someint > 5:
return someint
y = return_something(2)
y.real()
This is going to give you the error
AttributeError: 'NoneType' object has no attribute 'real'
So points are as below.
In the code, a function or class method is not returning anything or returning the None
Then you try to access an attribute of that returned object(which is None), causing the error message.
if val is not None:
print(val)
else:
# no need for else: really if it doesn't contain anything useful
pass
Check whether particular data is not empty or null.
It means the object you are trying to access None. None is a Null variable in python.
This type of error is occure de to your code is something like this.
x1 = None
print(x1.something)
#or
x1 = None
x1.someother = "Hellow world"
#or
x1 = None
x1.some_func()
# you can avoid some of these error by adding this kind of check
if(x1 is not None):
... Do something here
else:
print("X1 variable is Null or None")
When building a estimator (sklearn), if you forget to return self in the fit function, you get the same error.
class ImputeLags(BaseEstimator, TransformerMixin):
def __init__(self, columns):
self.columns = columns
def fit(self, x, y=None):
""" do something """
def transfrom(self, x):
return x
AttributeError: 'NoneType' object has no attribute 'transform'?
Adding return self to the fit function fixes the error.
g.d.d.c. is right, but adding a very frequent example:
You might call this function in a recursive form. In that case, you might end up at null pointer or NoneType. In that case, you can get this error. So before accessing an attribute of that parameter check if it's not NoneType.
You can get this error with you have commented out HTML in a Flask application. Here the value for qual.date_expiry is None:
<!-- <td>{{ qual.date_expiry.date() }}</td> -->
Delete the line or fix it up:
<td>{% if qual.date_attained != None %} {{ qual.date_attained.date() }} {% endif %} </td>
None of the other answers here gave me the correct solution. I had this scenario:
def my_method():
if condition == 'whatever':
....
return 'something'
else:
return None
answer = my_method()
if answer == None:
print('Empty')
else:
print('Not empty')
Which errored with:
File "/usr/local/lib/python3.9/site-packages/gitlab/base.py", line 105, in __eq__
if self.get_id() and other.get_id():
AttributeError: 'NoneType' object has no attribute 'get_id'
In this case you can't test equality to None with ==. To fix it I changed it to use is instead:
if answer is None:
print('Empty')
else:
print('Not empty')
I'm creating a new column named lead_actor_actress_known whose values is boolean based on whether there value in 2nd column lead_actor_actress has value or not. If there is a value(Name of actors) populate 1st column using True if there is no value, return False
AttributeError: 'str' object has no attribute 'isnull'
My code is throwing an error above.
df['lead_actor_actress_known'] = df['lead_actor_actress'].apply(lambda x: True if x.isnull() else False)
What i'm i missing?
Henry Ecker's comment contains the answer to this question, I am reproducing in the answer section for convenience. Replace your application of the .apply() method with the code df['lead_actor_actress_known'] = df['lead_actor_actress'].isna().
The thing to know here is that df['lead_actor_actress'].isna() returns a "Boolean mask" (a series of True and False values) and this is exactly what you are asking to assign the variable lead_actor_actress.
when executing the following code, I get the error message "AttributeError: 'int' object has no attribute 'append'". I know this error occurs when I try to append to an integer, for example, which is not the case here since I checked that via type(section[len(section)-1]) which returned list
def increasing_section(a_list):
section = [[a_list[0]]]
i = 1
while i < len(a_list):
if a_list[i-1] < a_list[i]:
section[len(section)-1].append(a_list[i])
else:
section.append(a_list[i])
i += 1
return section
The error comes from this line:
section[len(section)-1].append(a_list[i])
because at some point, when your if condition will not be met, the following line:
section.append(a_list[i])
will add an integer in section and the first line will produce error as section[len(section)-1] will be an integer
I'm not sure what exactly you are trying to do, but to fix this you need to change section[len(section)-1].append(a_list[i]). Because section[len(section)-1] will return an integer and integer doesn't have append method, so if you want to insert an element to a list at a particular index, try section.insert(index, value)
I'm getting this error when I run my python script:
TypeError: cannot concatenate 'str' and 'NoneType' objects
I'm pretty sure the 'str' means string, but I dont know what a 'NoneType' object is. My script craps out on the second line, I know the first one works because the commands from that line are in my asa as I would expect. At first I thought it may be because I'm using variables and user input inside send_command.
Everything in 'CAPS' are variables, everything in 'lower case' is input from 'parser.add_option' options.
I'm using pexpect, and optparse
send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)
send_command(child, SNMPSRVUSRCMD + snmpuser + group + V3AUTHCMD + snmphmac + snmpauth + PRIVCMD + snmpencrypt + snmppriv)
NoneType is the type for the None object, which is an object that indicates no value. None is the return value of functions that "don't return anything". It is also a common default return value for functions that search for something and may or may not find it; for example, it's returned by re.search when the regex doesn't match, or dict.get when the key has no entry in the dict. You cannot add None to strings or other objects.
One of your variables is None, not a string. Maybe you forgot to return in one of your functions, or maybe the user didn't provide a command-line option and optparse gave you None for that option's value. When you try to add None to a string, you get that exception:
send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)
One of group or SNMPGROUPCMD or V3PRIVCMD has None as its value.
For the sake of defensive programming, objects should be checked against nullity before using.
if obj is None:
or
if obj is not None:
NoneType is simply the type of the None singleton:
>>> type(None)
<type 'NoneType'>
From the latter link above:
None
The sole value of the type NoneType. None is frequently used to represent the absence of a value, as when default arguments are not passed to a function. Assignments to None are illegal and raise a SyntaxError.
In your case, it looks like one of the items you are trying to concatenate is None, hence your error.
It means you're trying to concatenate a string with something that is None.
None is the "null" of Python, and NoneType is its type.
This code will raise the same kind of error:
>>> bar = "something"
>>> foo = None
>>> print foo + bar
TypeError: cannot concatenate 'str' and 'NoneType' objects
In Python
NoneType is the type of the None object.
There is only one such object.
Therefore, "a None object" and "the None object" and
"None" are three equivalent ways of saying the same thing.
Since all Nones are identical and not only equal,
you should prefer x is None over x == None in your code.
You will get None in many places in regular Python
code as pointed out by the accepted answer.
You will also get None in your own code when you
use the function result of a function that does not end with
return myvalue or the like.
Representation:
There is a type NoneType in some but not all versions of Python,
see below.
When you execute print(type(None)), you will get
<type 'NoneType'>.
This is produced by the __repr__ method of NoneType.
See the documentation of repr
and that of
magic functions
(or "dunder functions" for the double underscores in their names) in general.
In Python 2.7
NoneType is a type defined in the
standard library module types
In Python 3.0 to 3.9
NoneType has been
removed
from
module types,
presumably because there is only a single value of this type.
It effectively exists nevertheless, it only has no built-in name:
You can access NoneType by writing type(None).
If you want NoneType back, just define
NoneType = type(None).
In Python 3.10+
NoneType is again a type defined in the
standard library module types,
introduced in order to
help type checkers do their work
In Python, to represent the absence of a value, you can use the None value types.NoneType.None
In the error message, instead of telling you that you can't concatenate two objects by showing their values (a string and None in this example), the Python interpreter tells you this by showing the types of the objects that you tried to concatenate. The type of every string is str while the type of the single None instance is called NoneType.
You normally do not need to concern yourself with NoneType, but in this example it is necessary to know that type(None) == NoneType.
Your error's occurring due to something like this:
>>> None + "hello world"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
>>>
Python's None object is roughly equivalent to null, nil, etc. in other languages.
If you're getting type None for an object, make sure you're returning in the method. For example:
class Node:
# node definition
then,
def some_funct():
# some code
node = Node(self, self.head)
self.head = node
if you do not return anything from some_func(), the return type will be NoneType because it did not return anything.
Instead, if you return the node itself, which is a Node object, it will return the Node-object type.
def some_func(self):
node = Node(self, self.head)
self.head = node
return node
One of the variables has not been given any value, thus it is a NoneType. You'll have to look into why this is, it's probably a simple logic error on your part.
It's returned when you have for instance print as your last statement in a function instead of return:
def add(a, b):
print(a+ b)
x = add(5,5)
print(x)
print(type(x))
y = x + 545
print(y)
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
<class 'NoneType'>
def add(a, b):
return (a+ b)
x = add(5,5)
print(x)
print(type(x))
10
<class 'int'>
555
NoneType is the type of None.
See the Python 2 docs here:
https://docs.python.org/2/library/types.html#types.NoneType
NoneType is type of None. Basically, The NoneType occurs for multiple reasons,
Firstly when you have a function and a condition inside (for instance), it will return None if that condition is not met.
Ex:-
def dummy(x, y): if x > y: return x res = dummy(10, 20) print(res) # Will give None as the condition doesn't meet.
To solve this return the function with 0, I.e return 0, the function will end with 0 instead of None if the condition is not satisfied.
Secondly, When you explicitly assign a variable to a built-in method, which doesn't return any value but None.
my_list = [1,2,3]
my_list = my_list.sort()
print(my_list) #None sort() mutate the DS but returns nothing if you print it.
Or
lis = None
re = lis.something())
print(re) # returns attribute error NonType object has no attribute something
I'm seeing weird behavior on this code:
images = dict(cover=[],second_row=[],additional_rows=[])
for pic in pictures:
if len(images['cover']) == 0:
images['cover'] = pic.path_thumb_l
elif len(images['second_row']) < 3:
images['second_row'].append(pic.path_thumb_m)
else:
images['additional_rows'].append(pic.path_thumb_s)
My web2py app gives me this error:
if len(images['cover']) == 0:
TypeError: object of type 'NoneType' has no len()
I can't figure out what's wrong in this. Maybe some scope issue?
You assign something new to images['cover']:
images['cover'] = pic.path_thumb_l
where pic.path_thumb_l is None at some point in your code.
You probably meant to append instead:
images['cover'].append(pic.path_thumb_l)
your problem is that
if len(images['cover']) == 0:
checks the LENGTH of the value of images['cover'] what you meant to do is check if it HAS a value.
do this instead:
if not images['cover']:
The first time you assign: images['cover'] = pic.path_thumb_l, it replaces the value of the empty list initially stored in images['cover'] with the value of pic.path_thumb_l which is None.
Maybe your code in this line must be images['cover'].append(pic.path_thumb_l)
We can also see the type in the same condition, to avoid something if you want, like
if myArray is None:
#Do something when array has no len()
else:
#Do something when array has elements and has len()
In my case I was looking for something in the array, but only if has something, when id does not, was None the type and I need to create it. Hope this works for someones.