python-- 문제점

6462 단어 python 기반

1. 귀속 생성기

def flatten(nested): 
	try: 
 		for sublist in nested: 
  			for element in flatten(sublist): 
   				yield element 
	except TypeError: 
		yield nested 

flatten을 호출할 때 두 가지 가능성이 있습니다. (귀속을 처리할 때 모두 마찬가지입니다.) 기본 조건과 귀속 조건입니다.기선 조건에서 이 함수는 하나의 원소(예를 들어 하나의 수)를 전개해야 한다.이 경우 for 순환은 TypeError 이상을 일으킬 수 있으며, 이 생성기는 하나의 요소만 생성합니다.그러나 목록(또는 다른 교체 가능한 대상)을 펼치려면 작업을 해야 한다. 모든 하위 목록을 훑어보고 flatten을 호출한 다음 다른 for 순환을 사용하여 펼친 하위 목록의 모든 요소를 생성한다.이것은 좀 불가사의해 보일 수도 있지만, 확실히 가능하다.
>>> list(flatten([[[1], 2], 3, 4, [5, [6, 7]], 8])) 
[1, 2, 3, 4, 5, 6, 7, 8] 

그러나 이 해결 방안에는 문제가 하나 있다.nested가 문자열이나 문자열과 유사한 대상이라면, 서열에 속하기 때문에 TypeError 이상을 일으키지 않지만, 교체를 원하지 않습니다.
함수flatten에서 문자열과 유사한 대상을 교체해서는 안 된다. 주요 원인은 두 가지가 있다.우선, 문자열과 유사한 대상을 펼쳐야 할 서열이 아니라 원자값으로 간주하고 싶습니다.그 다음에 이러한 대상을 교체하면 무한한 귀속을 초래할 수 있다. 왜냐하면 문자열의 첫 번째 요소는 길이가 1인 문자열이고 길이가 1인 문자열의 첫 번째 요소는 문자열 자체이기 때문이다.이런 문제를 처리하려면 생성기 시작에서 검사를 해야 한다.객체가 문자열과 유사한지 확인하려면 TypeError 예외를 유발하는지 여부 ① 를 확인하는 것이 가장 간단하고 빠른 방법입니다.이 체크를 추가한 생성기는 다음과 같습니다.
def flatten(nested): 
	try: 
		#  : 
		try: nested + '' 
		except TypeError: pass 
		else: raise TypeError 
			for sublist in nested: 
				for element in flatten(sublist): 
					yield element 
	except TypeError: 
		yield nested 

보시다시피 표현식 nested +'TypeError 이상이 발생하면 이 이상을 무시합니다.TypeError 이상이 발생하지 않으면 내부try 문장의else 자구가 TypeError 이상을 일으켜 외부의 excpet 자구에서 문자열과 유사한 대상을 봉하지 않고 생성합니다.알겠나?다음 예제에서는 이 버전을 문자열에도 사용할 수 있습니다.
>>> list(flatten(['foo', ['bar', ['baz']]])) 
['foo', 'bar', 'baz'] 

형식 검사가 실행되지 않았습니다. nested가 문자열인지 확인하지 않았습니다. 문자열과 연결될 수 있는지 확인하지 않았을 뿐입니다.이러한 검사에 있어서 더욱 자연스러운 대체 방안은 isinstance와 문자열과 문자열과 유사한 대상의 추상적인 클래스를 사용하는 것이지만 유감스럽게도 이러한 표준 클래스가 없다.또한 UserString에서도 유형이str인지 확인할 수 없습니다.

좋은 웹페이지 즐겨찾기