flask 개발 중에 다음과 같은 에러를 발견했다.


  File "/Users/samuel.kim/.pyenv/versions/2.7.12/lib/python2.7/site-packages/flask/app.py", line 1051, in add_url_rule

    'existing endpoint function: %s' % endpoint)

AssertionError: View function mapping is overwriting an existing endpoint function: xxx




이 이유는 서로 다른 URL에서 동일한 Controller 클래스를 사용하면 발생한다.


즉, 다음과 같은 형태로 호출되는 것을 의미한다.



api.add_resource(AuthServiceController,'/authorization') 


api.add_resource(AuthServiceController,'/authentication') 




각 URL 마다 서로 다른 Controller를 수정하면 정상적으로 동작된다. 

Posted by '김용환'
,

[python] str과 repr 비교

python 2018. 1. 23. 14:57


python에는 Java의 toString()과 같은 문법이 있다. 




>>> import datetime

>>> today = datetime.datetime.now()

>>> str(today)

'2018-01-23 14:49:37.284361'

>>> repr(today)




>>> f=1.1111111111111111

>>> str(f)

'1.11111111111'

>>> repr(f)

'1.1111111111111112'




str은 사용자가 보기 편하게 "비공식"적으로 쓰는 문자열(반드시) 표현법이고,

repr은 시스템에서 구분하기 위한 공식적연 표현법이며 문자열이 아니어도 된다.



https://docs.python.org/3.7/reference/datamodel.html#object.__repr__


object.__repr__(self)

Called by the repr() built-in function to compute the “official” string representation of an object. If at all possible, this should look like a valid Python expression that could be used to recreate an object with the same value (given an appropriate environment). If this is not possible, a string of the form <...some useful description...> should be returned. The return value must be a string object. If a class defines __repr__() but not __str__(), then __repr__() is also used when an “informal” string representation of instances of that class is required.


This is typically used for debugging, so it is important that the representation is information-rich and unambiguous.


object.__str__(self)

Called by str(object) and the built-in functions format() and print() to compute the “informal” or nicely printable string representation of an object. The return value must be a string object.


This method differs from object.__repr__() in that there is no expectation that __str__() return a valid Python expression: a more convenient or concise representation can be used.


The default implementation defined by the built-in type object calls object.__repr__().



Posted by '김용환'
,

[python] datetime 예제

python 2017. 11. 20. 11:35


파이썬에는 datetime 클래스를 통해 시간을 제어할 수 있다.


현재 시간을 확인하려면 now()를 호출한다.


>>> import datetime

>>> datetime.datetime.now()

datetime.datetime(2017, 11, 20, 11, 27, 46, 820594)



크리스마스까지의 남은 시간을 구하는 예제이다. 현재 시간에서 12월 25일까지의 시간을 


>>> datetime.datetime.now() - datetime.datetime(2017, 12, 25)

datetime.timedelta(-35, 41357, 474997)


사실 이는 정확치 않다. 직접 날짜를 지정하면 된다.


>>> datetime.datetime(2017,12,25)-datetime.datetime(2017,11,20)

datetime.timedelta(35)



timestamp를 구하고 싶다면 timestamp()를 호출한다.


>>> datetime.datetime.now().timestamp()

1511145029.058472




일주일 전 날을 알고 싶다면 datetime.timedelta를 사용한다.


>>> datetime.datetime.now()- datetime.timedelta(days=7)

datetime.datetime(2017, 11, 13, 11, 35, 24, 933742)


Posted by '김용환'
,




SyntaxError: Non-ASCII character '\xec' in file oncall-bot.py on line 50, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details


이 에러는 한글 때문에 발생한 것이다. mac에는 문제 없으나 linux에서 발생했다. 


code에 utf-8 인코딩 설정을 추가하니 더 이상 문제가 발생하지 않는다. 

# -*- coding: utf-8 -*- 


Posted by '김용환'
,


elasticsearch에 보면 json 출력을 예쁘게 (&pretty) 할 수 있다.



만약 url을 통해 들어오는 json이라면 python을 활용해 예쁘게 출력할 수 있다. 



echo '{"url":"http:\/\/search.google.com\/api/v2/keyword", "param":"abc"}' | python -mjson.tool

{

    "url": "http://search.google.com/api/v2/keyword",

    "param": "abc"

}




Posted by '김용환'
,



python3로 마이그레이션 하던 중에 다음과 같은 에러를 만났다.


 {%- for hostname, stat in stat.iteritems() %}

jinja2.exceptions.UndefinedError: 'dict object' has no attribute 'iteritems'





python3의 dict 클래스의 iteritems는 items로 변경되었다.







Posted by '김용환'
,



virtualenv에서 그냥 가상 환경을 실행하면 python2 환경으로 구축된다.



$ virtualenv envname




python3 환경으로 구축하고 싶다면 다음 커맨드를 실행한다.



$ virtualenv -p python3 envname



Posted by '김용환'
,


python 컴파일시 아래와 같은 python 에러가 발생할 수 있다. 




gevent/gevent.corecext.c:5:20: fatal error: Python.h: No such file or directory
#include "Python.h"
^
compilation terminated.
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1




python 개발 라이브러리가 없어서 에러가 발생한 것이다.




python 2.x라면 다음과 같이 실행한다.


$ sudo apt-get install python-dev



python 3.x라면 다음과 같이 실행한다.


$ sudo apt-get install python3-dev



Posted by '김용환'
,

[python3] ++ 연산자

python 2017. 9. 28. 20:03

python3에는 ++ 연산자가 없다.


+= 연산자만 있을 뿐이다.


예제



            if not self.conn.connected:

                retry_count += 1

Posted by '김용환'
,





            

            

python2에서 string 타입에 대해서 decode('utf-8')를 잘 실행할 수 있지만, 

python3에서는 기본이 utf-8이기 때문에 굳이 decode를 사용할 필요가 없다. 따라서 decode 함수도 없다. 



>>> result = ""

>>> str(type(result))

"<class 'str'>"

>>> result.decode('utf-8')

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'str' object has no attribute 'decode'

>>>


https://docs.python.org/3/howto/unicode.html


The default encoding for Python source code is UTF-8, so you can simply include a Unicode character in a string literal:





또한 None도 생겼다.


python2에서는 kazoo를 통해서 얻은 값은 empty string이였는데.. python3에서는 None타입을 사용했다.

flask에서는 다음과 같이 사용했다.

{% if node.data == None %}
{% else %}
<span style="word-wrap: break-word">
{{node.data}}
</span>
{% endif %}




그리고 




파이썬2에서 딕셔너리의 iteritems()는 사라지고 items()로 대체되었다.





message = '\n'.join("%s: %s" % (key, val) for (key, val) in (sorted(rep.items())))







그 외


https://wiki.python.org/moin/Python3.0#Built-In_Changes를 참고한다.





파이썬2에서 3로 전환하면서.. 발생했는데..


flask에서는 아래와 같은 코드는 에러가 발생한다 (TypeError: 'NoneType' object is not subscriptable)

if request.json['head_commit'] is not None:


flask 0.10부터 json 프로퍼티는 None을 리턴한다. 2->3 버전 이슈는 아니고 라이브러리 이슈가 있다.


if request.get_json('head_commit') is not None:


Posted by '김용환'
,