일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- S3
- Django
- python
- MySQL server on 'db' (115)
- Spring
- AWS S3
- depends_on
- 우아한테크코스 2차
- 프로그래머스
- depends
- 재귀함수가 뭔가요
- docker
- github
- 갓재석
- docker-compose
- springboot 3.0.0
- 우아한 테크코스 2차 합격
- EC2
- python all testcode
- javascript
- AWS
- classmethod
- 2차 코딩테스트
- classproperty
- github skyline
- TypeError: 'property' object is not iterable
- METACLASS
- 코딩테스트
- DB
- OperationalError
Archives
hanbin.dev
TypeError: 'property' object is not iterable 본문
import peewee
class MySQLModel(peewee.Model):
@property
@classmethod
def unique_fields(cls) -> list:
for field_name in cls._meta.fields.keys():
field = getattr(cls, field_name)
if field.unique == True or field.primary_key == True:
yield field
peewee 모델의 unique한 field의 이름을 iterable한 객체로 반환하는 property 함수를 만들었다.
key in [field.name for field in MySQLModel.unique_fields]
그런데 위와 같이 사용 할 때 TypeError: 'property' object is not iterable 에러가 발생했다.
해결방법을 찾아보니 metaclass에서 property 함수를 만드는 방법, class decorator를 직접 만들어서 처리하는 방법 등이 있었다.
class decorator를 직접 만들어서 처리하는 방법은 아래와 같은데, 이게 마음에 들었다.
class classproperty(object):
def __init__(self, function):
self.function = function
def __get__(self, owner_self, owner_cls): # classproperty 객체에 접근할 때 inner_func 결과값을 반환하도록
return self.function(owner_cls)
class MySQLModel(peewee.Model):
@classproperty
def unique_fields(cls) -> list:
for field_name in cls._meta.fields.keys():
field = getattr(cls, field_name)
if field.unique == True or field.primary_key == True:
yield field
'Python' 카테고리의 다른 글
[Python] NotImplementedError: Don't know how to literal-quote value ~ (0) | 2022.07.27 |
---|---|
[Python] metaclass 란 (0) | 2022.06.06 |
[Python] unittest 모든 테스트 코드 실행하기 (0) | 2021.05.29 |
[Python] namespace란 (0) | 2021.05.12 |
[Python] 메타클래스(metaclass) 란? (0) | 2021.05.11 |