2019.7.30 헷갈리는 Python의 attribute. (getattr, __getattr__, __getattribute__)

1. getattr(arg) : 객체로부터 arg attribute를 가져오는 함수이다. class Count(object): def __init__(self, mymin, mymax): self.mymin = mymin self.mymax = mymax self.current = None getattr(a, 'mymin') # 10 getattr(a, 'mymax') # 20 getattr(a, 'no attribute') # error raised 2. __getattr__(): 객체의 attribute를 호출했을 때 그 attribute가 존재하지 않는다면 실행되는 함수이다. class Count(object): def __init__(self, mymin, mymax): self.mymin = mymin self.mymax = mymax self.current = None def __getattr__(self, fallback): print("In __getattr__", fallback) a = Count(10, 20) a.mymin # 10 a.mymax # 20 a.noattribute # In __getattr__noattribute 3. __getattribute__ : 객체의 attribute를 조회할 때 조회하는 로직이 실행 되기 전에 실행되는 함수이다. 즉, get을 할 때 항상 도는 코드라고 볼 수 있다. 만약 __getattr__ 과 __getattribute__가 같이 구현되어 있을 때 없는 attribute를 조회한다면 __getattr__의 우선순위가 높다.

2019.07.30 Git reset

여기서 –hard 옵션을 사용하지 않으면 변경내역이 있는 파일들은 working directory에 modified 상태로 유지 Soft : 워킹 디렉토리와 index는 그대로 두고 브랜치만 전으로 되돌린다.(파일들은 그대로 남아있다는 뜻) Mixed : 워킹 디렉토리는 그대로 두지만 인덱스를 포함해서 브랜치까지 전으로 되돌린다.(git commit과 git add명령까지 되돌린다는 뜻) Hard : 실제 데이터까지 지워버릴 수 있어 위험하지만 워킹 디렉토리까지 이전으로 되돌릴 수 있다.(복구는 불가능하지만 되돌리고 다음 commit이 남아있다면 reflog로 복원 가능) 출처 : https://dydtjr1128.github.io/git/2019/07/28/Git-Reset.html git hard reset을 하니 파일이 없어져서 당황했었는데, 완전히 파일들을 날릴 게 아니면 soft와 mixed를 적절히 활용해야한다. add된 상태로 되돌리고 싶으면 soft, file add까지 뺀 상태로 되돌리고 싶으면 mixed. hard는 갑자기 삘받아서 엄청 휘갈겨썼는데 파일들을 지우고 싶거나 할 때 쓰면 될듯. git reset --option(soft, hard, mixed) COMMIT ID

2019.07.25 python String을 다룰 때 String 앞에 자꾸 backslash 가 앞에 붙는 문제

웹에서 POST로 받는 데이터 포맷이 'data': 'payload' 방식인데 내 payload는 double-quoted로 되어있었다. 따라서 payload 부분에 single-quote를 추가로 더해주었더니 자꾸만 앞에 backslash가 붙어서 서버에서 데이터를 파싱할 때 문제를 일으켰다. 이것저것 찾아보니... 결국 서버에서 데이터를 받을 때 굳이 single-quote를 안 붙여줘도 자동으로 single-quote로 만들더라ㅠㅠ 그래서 single-quote를 억지로 앞에 붙이니 '어 이 친구는 스트링 마크가 아니라 진짜 필요한 single-quote이구나' 하면서 계속해서 앞에 backslash를 붙인듯 하다. 결론 : single-quote로 wrapped 된 데이터가 필요할 때 자꾸 backslash가 문제를 일으키면 그냥 single-quote를 빼고 데이터를 전송해보자 ㄹㅇ 별거 아닌것 때문에 몇시간을.. ㅂㄷㅂㄷ;;;

2020년 1월 1일에 하는 2019년의 목표 달성여부 점검

2019년의 목표와 2020년 1월 1일에 하는 점검 1. 파이썬 중급 레벨로 올리기 (반반)  1) 파이썬의 고급 문법들까지 숙달하고 파이썬 언어에 대한 철학을 이해하고 그에 따라 코딩하기  2) 데코레이터와 같은 additional 기능들을 편하고 자유자재로 쓸 수 있을 것  3) 메모리 관리에 대해 유의하며 프로그래밍 할 수 있을 것 - 수강 중인 인터넷강의 완주하고 배운 내용들을 정리해서 github에 올리기 (by 3/31) - 조금 애매하지만, 3번을 빼고는 어찌보면 반 정도는 하지 않았나 싶다. 데코레이터는 마치 list comprehension을 사용하듯 완전 편안하게 쓸 수 있는 것은 아니지만 how it works behind the scene은 꽤 이해가 된 덕분. 디스크립터는 실전에서 사용할 일은 없었지만 크게 어려운 부분은 없고 3.7부터 추가 된 dataclass를 사용한다면 어쩌면 크게 사용할 일이 없지 않을까 싶기도 하다. - 3번 메모리 관리에 유의하며 프로그래밍은 (아직도 멀긴했지만) 왠만하면 generator, set를 사용하고자 하니 내 레벨에선 30%는 줄 수 있지 않을까. 2. 내 블로그 사이트를 배포하기 (실패)   1) 나에 대한 이력서, 포폴관리 - 언제나 웹으로 업데이트하고 다운로드 받아서 쉽게 PDF화 할 수 있는 방식으로 만들기   2) 현재 내가 가진 기술의 종류, 레벨, description을 충분히, 명료히 설명할 수 있도록 만들기   3) 내가 찍은 사진 업로드도 가능하도록 하기   4) 내 게시판을 만들 것인가는 고려해보기 - 암호화, 보안까지 고려 된 내 블로그 사이트를 구축하고 세상에 배포하기 (by 6/30) - 손도 못 댄 Task.. 이상하게 내 Blog는 만들기가 싫은게... 3. Javascript 공부 (완료) - 사실 Udemy인강을 완주하고 배운 내용들을 한 번 써먹을 겸 ...

2019.05.23 - SQLAlchemy 의 객체 상태 관리 (expire, refresh, flush, commit) 에 관한 이해

SQLAlchemy에서 모델을 다루는 stage에 대해 알아보았다. Expire I've made some changes to an object and don't need it immediately but don't want any subsequent methods to use stale values. db.session.expire(Model) Refresh I've made some changes to an object and need its updated values immediately. Costs extra database call as it expires and reads from database immediately. Flush Push changes from memory to your database's transaction buffer. No database statements are issued yet. If Session has autocommit: False, must still call commit() to persist the changes or rollback() to discard changes. If Session has autocommit: True and you are not explicitly in a transaction, commit() will be automatically called. Commit Persist changes in your database's transaction buffer to the database. Database statements are issued. Automatically expires objects. Merge Used when you may have more than 1 in-memory objects which map to the same database record with some ke...

2019.05.21 - 클래스 데코레이터를 이용한 데이터 직렬화 (Clean) 코드

def hide_field ( field ) -> str : return "**민감한 정보 삭제" def show_original (event_field): return event_field class EventSerializer: def __init__ ( self , serialization_fields: dict ) -> None : self .serialization_fields = serialization_fields def serialize ( self , event) -> dict : return { field: transformation( getattr (event , field)) for field , transformation in self .serialization_fields.items() } class Serialization: def __init__ ( self , **transformations): self .serializer = EventSerializer(transformations) def __call__ ( self , event_class): def serialize_method (event_instance): return self.serializer.serialize(event_instance) event_class.serialize = serialize_method return event_class @Serialization ( name =show_original , password =hide_field ) @dataclass class LoginEvent: name: str password: str 일단 EventS...

2019.05.20 - Flask + Vue + Webpack 관련

회사에서 돌리는 플젝이 Vue파일을 수정하면 자동으로 브라우저에서 refresh 되고 flask에서 서빙하는 것처럼 보인다. 집에서도 환경을 똑같이 구축해보려고 하는데 한번에 바로 다 할 수는 없으므로 일단 js파일을 수정하면 auto refresh를 하게 하는게 첫번째 목표이지만.. 잘 안풀린다. 웹팩은 엔트리파일, 아웃풋 파일이 있다. 엔트리 : 번들링을 시작할 시발점.  아웃풋 : 번들링 된 JS가 기록 될 파일. 일단 webpack.config.js까지 만들고 webpack --watch를 하면 자동으로 변경사항이 발생할 경우 번들링 된 파일이 생성되지만, 브라우저에서 auto refresh는 하지 않는다. 그래서 webpack-dev-server를 사용하면 auto-refresh를 하게할 수 있다는데 아직 되질 않는다. dev-server를 키고 변경을 하면 터미널에 recompiling되는 메시지가 나오는 걸로 보아 변경사항이 감지는 되는것 같지만 이상하게 번들링 된 결과물엔 변경 된 사항이 반영되어있지 않다. 내일은 일단 컴파일 완료 메시지부터 좀 시작을 해봐야지..