일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 프로그래머스
- depends_on
- classmethod
- DB
- docker-compose
- S3
- python
- python all testcode
- classproperty
- AWS S3
- docker
- Spring
- OperationalError
- Django
- javascript
- springboot 3.0.0
- 우아한테크코스 2차
- 2차 코딩테스트
- 코딩테스트
- AWS
- github
- depends
- METACLASS
- EC2
- github skyline
- 우아한 테크코스 2차 합격
- MySQL server on 'db' (115)
- 재귀함수가 뭔가요
- TypeError: 'property' object is not iterable
- 갓재석
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 |