0

I want to write a general function that takes two input variables var1, var2 and returns the concatenation of both.

Each variable has the default value None, and can be either a single element or a list.

The expected output should be a list (even if both var1 and var2 are None, it should return an empty list []).

Below is my function:

def my_func(var1=None, var2=None):
    if not isinstance(var1, list):
        var1 = [var1]
    if not isinstance(var2, list):
        var2 = [var2]
    return var1 + var2 

When I only input one variable, I get the following:

>>> lst = my_func(var2=[1, 2, 3])
>>> print(lst)
[None, 1, 2, 3]

I want to get

[1, 2, 3]

Is there any way to convert None to [] in the function, without changing the default None values?

Federico Baù
  • 6,013
  • 5
  • 30
  • 38
Shaun Han
  • 2,676
  • 2
  • 9
  • 29

4 Answers4

6

Instead of None you could use [] as a default argument for each var.

def my_func(var1 = [], var2 = []):
    if not isinstance(var1, list):
        var1 = [var1]
    if not isinstance(var2, list):
        var2 = [var2]
    return var1 + var2 
        
lst = my_func(var2=[1, 2, 3])
print(lst)

However as user mkrieger1 suggested in the comments it might be a bad idea as seen in this question "Least Astonishment" and the Mutable Default Argument so instead you can do this:

def my_func(var1 = None, var2 = None):
    var1 = [] if var1 is None else var1
    var2 = [] if var2 is None else var2

    if not isinstance(var1, list):
        var1 = [var1]
    if not isinstance(var2, list):
        var2 = [var2]
    return var1 + var2 

    
lst = my_func(var2=[1, 2, 3])
print(lst)

Output:

[1, 2, 3]
solid.py
  • 2,782
  • 5
  • 23
  • 30
2

You can check first if var (1 and 2) are Not None

def my_func(var1=None, var2=None):
    var1 = var1 if var1 is not None else []
    var2 = var2 if var2 is not None else []
    if not isinstance(var1, list):
        var1 = [var1]
    if not isinstance(var2, list):
        var2 = [var2]

    return var1 + var2

This will cover many cases, such as :

print(my_func(var2=[1, 2, 3]))
print(my_func(var1=None,var2=[1, 2, 3]))
print(my_func(var1=0,var2=[1, 2, 3]))
print(my_func(var1=False,var2=[1, 2, 3]))
print(my_func(var1='',var2=[1, 2, 3]))

[1, 2, 3]                                                                                                                                                                                                                                       
[1, 2, 3]                                                                                                                                                                                                                                       
[0, 1, 2, 3]                                                                                                                                                                                                                                    
[False, 1, 2, 3]                                                                                                                                                                                                                                
['', 1, 2, 3]
Cid
  • 14,968
  • 4
  • 30
  • 45
1

Adding to @solif.py answer in case you want to keep the None value (hence the default value is not a mutable object) then run a simple test as so:

def my_func(var1=None, var2=None):
    if not var1:
        var1 = []
    if not var2:
        var2 = []
    if not isinstance(var1, list):
        var1 = [var1]
    if not isinstance(var2, list):
        var2 = [var2]

    return var1 + var2


lst = my_func(var2=[1, 2, 3])
print(lst)

EDIT:

After further review your code, you can actually just change the if not isinstance(var1, list) line as so:

def my_func(var1=None, var2=None):

    if not isinstance(var1, list):
        var1 = []
    if not isinstance(var2, list):
        var2 = []
    

    return var1 + var2


lst = my_func(var2=[1, 2, 3])
print(lst)

Other solution

NOTE @Cid answer basically changes the argument var1 or var2 only if is equal to None hence the following can be done:

def my_func(var1=None, var2=None):

    if var1 == None:
        var1 = []
    if var2 == None:
        var2 = []
    if not isinstance(var1, list):
        var1 = [var1]
    if not isinstance(var2, list):
        var2 = [var2]
    return var1 + var2


lst = my_func(var1=False, var2=[1, 2, 3])
print(my_func(var2=[1, 2, 3]))
print(my_func(var1=None,var2=[1, 2, 3]))
print(my_func(var1=0,var2=[1, 2, 3]))
print(my_func(var1=False,var2=[1, 2, 3]))
print(my_func(var1='',var2=[1, 2, 3]))

output

[1, 2, 3]                                                                                                                                                                                                                                       
[1, 2, 3]                                                                                                                                                                                                                                       
[0, 1, 2, 3]                                                                                                                                                                                                                                    
[False, 1, 2, 3]                                                                                                                                                                                                                                
['', 1, 2, 3]
Federico Baù
  • 6,013
  • 5
  • 30
  • 38
-2

This is how I would remove all None from a list:

def my_func(var1=None, var2=None):
    lst = []
    c = 0
    
    if not isinstance(var1, list):
        var1 = [var1]
    if not isinstance(var2, list):
        var2 = [var2]
    lst =  var1 + var2

    for i in lst:
        if i == None:
            lst.pop(c)
        c += 1

    return lst
    

lst_ = my_func(var2=[1, 2, 3])
print(lst_)

I use a for loop to iterate each item in a list. If the item == None, the code removes it.

halfer
  • 19,824
  • 17
  • 99
  • 186
The Pilot Dude
  • 2,091
  • 2
  • 6
  • 24