+ 1

How can I force the function argument to be a list?

def manipulate_data(n): n=list(n) a=[] b=[] for i in n: if i<=0: a.append(i) if i>0: b.append(i) n=[len(a),sum(b)] return n gum= [2,4,5,-6,-7,]print (manipulate_data (gum))

4th Sep 2016, 12:33 PM
Dan-Awoh Emmanuel
Dan-Awoh Emmanuel - avatar
5 ответов
0
I want the function to be able to test it's argument (n) for only lists allowed
4th Sep 2016, 12:35 PM
Dan-Awoh Emmanuel
Dan-Awoh Emmanuel - avatar
0
First, remove n = list(n) line. You did it to ensure that n is a list, I understand that, but it doesn't solve your problem and actually is purposeless. What you probably want is to test if n is instance of a list, like this: if not isinstance(n, list): return None # or raise an exception or something else However, this is not pythonic way. It's easier to ask forgiveness than permission; assume that you get a list as parameter and fail gracefully if it's not. Wrap your code in try/except construction if you cannot iterate over n. The same goes for comparison with 0: what if n is a list of strings, not integers/floats? Just assume it's good, and fail if you encounter an error. As a side note, try to not modify your input, it's an unusual side effect, and it's not clear, and it's hard to see through or predict. Use other name than n for your output list construction. So to conclude, your code would look something like try: for i in n: # do your thing except TypeError: print('n is not iterable') return None
4th Sep 2016, 1:49 PM
trueneu
trueneu - avatar
0
thanks trueneu. I really appreciate it man. but I am not still clear on how to restrict implementation to a list of integers only. how do I do that
4th Sep 2016, 2:17 PM
Dan-Awoh Emmanuel
Dan-Awoh Emmanuel - avatar
0
Is this better? is it correct? def manipulate_data(n): a=[] b=[] if not isinstance(n,list): raise TypeError else: try: for i in n: if i<=0: a.append(i). if i>0: b.append(i) m=[len(a),sum(b)] return m except TypeError: print("your argument is either not iterable! or it isn't a list of integers!")
4th Sep 2016, 2:18 PM
Dan-Awoh Emmanuel
Dan-Awoh Emmanuel - avatar
0
You don't need to check explicitly if an argument is a list if it's in a try/except block. def manipulate_data(n): a = [] b = [] try: try: for i in n: if i <= 0: a.append(i) if i > 0: b.append(i) except TypeError: print("one of arguments is uncomparable with 0") return m = [len(a), sum(b)] return m except TypeError: print("your argument is not iterable.") This approach will also work if you pass a dict with integer keys, like print(manipulate_data({1: 'a', 2: 'b'})) ...or anything iterable with numbers as items. If you really want to explicitly make function fail if n is not a list, get rid of outer try/except block and do an isinstance test and fail if it fails: def manipulate_data(n): a = [] b = [] if not isinstance(n, list): print("argument is not a list") return try: for i in n: if i <= 0: a.append(i) if i > 0: b.append(i) except TypeError: print("one of arguments is uncomparable with 0") return m = [len(a), sum(b)] return m
4th Sep 2016, 2:36 PM
trueneu
trueneu - avatar