from fractions import gcd
import collections

def flat_iteration(l):
	for element in l:
		if isinstance(element, collections.Iterable):
			for element2 in flat_iteration(element):
				yield element2
		else:
			yield element

def xdir(obj, return_values=False):
	for attr in dir(obj):
		if attr[:2] != "__" and attr[-2:] != "__":
			if return_values:
				yield attr, getattr(obj, attr)
			else:
				yield attr

def autotype(s):
	if s == "True":
		return True
	elif s == "False":
		return False
	try:
		return int(s, 0)
	except ValueError:
		pass
	return s

def gcd_multiple(numbers):
	l = len(numbers)
	if l == 1:
		return numbers[0]
	else:
		s = l//2
		return gcd(gcd_multiple(numbers[:s]), gcd_multiple(numbers[s:]))