최신 파이썬 버전에서 collections.Iterable 속성이 deprecated 되었습니다. 이로 인해서 해당 속성값을 이용하려면 파이썬 2.7버전에서는 collections.Iterable로 사용해야 하고, 파이썬 3.10 버전에서는 collections.abc.Iterable로 사용해야 하는 문제가 있습니다.
본 페이지에서는 collections.Iterable 구문에서 발생하는 exception을 처리하는 방법에 대해서 설명하고자 합니다. 파이썬 버전에 따라서 호환되도록 처리해야 되기 때문에 try exception 구문을 할용하도록 하겠습니다.
문제의 상황
아래는 파이썬 3.10 버전에서 python-wordpress-xmlrpc 패키지를 설치해서 사용중에 발견된 런타임 에러입니다. 보시면 collections 모듈에 iterable이라는 속성이 없어서 발생했다는 것을 확인하실 수 있습니다.
Traceback (most recent call last): File "/home/parksejin/project/blog_automation/wordpress/./getPosts.py", line 18, in <module> getPosts( "https://www.webpage.com", File "/home/user/blog_automation/wordpress/getPosts.py", line 13, in getPosts postList = client.call(posts.GetPosts()) File "/usr/local/lib/python3.10/dist-packages/wordpress_xmlrpc/base.py", line 46, in call return method.process_result(raw_result) File "/usr/local/lib/python3.10/dist-packages/wordpress_xmlrpc/base.py", line 128, in process_result elif isinstance(raw_result, collections.Iterable): AttributeError: module 'collections' has no attribute 'Iterable' |
Exception이 발생한 파일을 vi 편집기로 열어서 확인해보겠습니다.
$ vi /usr/local/lib/python3.10/dist-packages/wordpress_xmlrpc/base.py
해당 모듈의 스크립트를 확인해보면 파이썬 버전에 대한 고려 없이 collections.Iterable로 속성에 접근하고 있는 것을 알 수 있습니다.
import collections
#중략
def process_result(self, raw_result):
"""
Performs actions on the raw result from the XML-RPC response.
If a `results_class` is defined, the response will be converted
into one or more object instances of that class.
"""
if self.results_class and raw_result:
if isinstance(raw_result, dict_type):
return self.results_class(raw_result)
elif isinstance(raw_result, collections.Iterable):
return [self.results_class(result) for result in raw_result]
return raw_result
대책
대책은 파이썬 버전에 따라서 다르게 처리하도록 하는 방법이 있겠습니다만, 그것보다는 try-exception 구문으로 처리하면 좀 더 깔끔하게 해결할 수 있습니다.
import collections
try:
collections = collections.abc
except AttributeError:
pass
#중략
def process_result(self, raw_result):
"""
Performs actions on the raw result from the XML-RPC response.
If a `results_class` is defined, the response will be converted
into one or more object instances of that class.
"""
if self.results_class and raw_result:
if isinstance(raw_result, dict_type):
return self.results_class(raw_result)
elif isinstance(raw_result, collections.Iterable):
return [self.results_class(result) for result in raw_result]
위와 같이 collections = collections.abc 구문을 실행하는데, 만약 collections.abc 속성이 없을 경우는 그냥 아무것도 처리하지 않도록 pass 시키면 깔끔하게 해결됩니다.
import collections
try:
collections = collections.abc
except AttributeError:
pass
즉, collections의 Iterable 속성을 사용하기 위해서는 위와 같은 방식으로 처리하면 되겠습니다. 제가 생각하는 best practice라고 생각됩니다. 다른 의견이 있으면 알려주시면 감사하겠습니다.
인사이트를 얻은 링크
해당 내용은 아래의 링크에서 인사이트를 얻어서 작성했습니다.
python-wordpress-xmlrpc 패키지 수정 관련
python-wordpress-xmlrpc 패키지에 해당 문제가 있어서 동일한 문제가 발생하고 있습니다. 아직 해당 패키지는 수정되지 않았고 현재 148번 pull request가 진행중에 있습니다. 아래 내용이 머지되면 이렇게 수동으로 모듈을 수정해주야되는 불편함이 사라지지 않을까 싶습니다.
관련 pull request는 아래 링크에서 확인하실 수 있습니다.
이상입니다.
'SW개발 > 파이썬' 카테고리의 다른 글
ModuleNotFoundError: No module named 'gtts' 해결 방법 (0) | 2022.09.27 |
---|---|
ModuleNotFoundError: No module named 'speech_recognition' 해결 방법 (0) | 2022.09.27 |
파이썬 스크립트 자동실행 방법 (#!/usr/bin/env python3) (0) | 2022.09.27 |
[우분투][파이썬] pip3: 명령이 없습니다 조치 방법 (0) | 2022.09.27 |
파이썬으로 다음 메일 읽는 방법 (예제 코드 포함) (0) | 2022.08.26 |
[python] requests시에 프락시 서버 설정하는 방법 + no proxy 설정하는 방법 (0) | 2022.03.10 |