2016-07-01 3 views
0

오픈 소스 프로젝트 (bquery)의 경우 Python 2.7에서 완벽하게 작동하는 cython 코드와 관련된 문제가 발생하지만 Python 3.x에서는 오류가 발생합니다. 전체 코드는 다음을 참조하십시오. https://github.com/visualfabriq/bquery/pull/66Python3의 Cython 바이트 오류

그러나 아이디어를 얻으려면 : 코드의 개념은 그룹화의 각 요소에 대해 고유 한/고유 한 값을 세는 것입니다. 나는 그것들이 유일하다는 것을 확인하기 위해 두 값의 해쉬 체크를 만든다. (그렇지 않으면 그룹당 해시 테이블이 필요하다. 많은 경우에 더 효율적 일지 모르지만 여기에는 기본 기술이 없다. 값을 통해 실행하고 싶지 않다. 여러 번). 값을 고유하게 만들기 위해 중간에 분리 기호가있는 문자열을 만든 다음 해시 테이블을 확인합니다. 여태까지는 그런대로 잘됐다! Python2에서 완벽한 결과를 보여 주며 합리적으로 빠릅니다. 하지만 파이썬 3에서는 오류가 발생합니다.

코드입니다 :

cdef 

    kh_str_t * table 
    char * element_1 
    char * element_2 
    char * element_3 
    int ret, size_1, size_2, size_3 

v = in_buffer[i] 
# index 
size_1 = len(bytes(current_index)) + 1 
element_1 = < char * > malloc(size_1) 
strcpy(element_1, bytes(current_index)) 
# value 
size_2 = len(str(v)) + 1 
element_2 = < char * > malloc(size_2) 
strcpy(element_2, bytes(v)) 
# combination 
size_3 = size_1 + size_2 + 2 
element_3 = < char * > malloc(size_3) 
strcpy(element_3, element_1 + '|' + element_2) 
# hash check 
k = kh_get_str(table, element_3) 
if k == table.n_buckets: 
    # first save the new element 
    k = kh_put_str(table, element_3, & ret) 
    # then up the amount of values found 
    out_buffer[current_index] += 1 

그리고 이것은 오류입니다 :

====================================================================== 
ERROR: test_groupby_08: Groupby's type 'count_distinct' 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/carst/venv3/lib/python3.5/site-packages/nose/case.py", line 198, in runTest 
    self.test(*self.arg) 
    File "/home/carst/PycharmProjects/bquery/bquery/tests/test_ctable.py", line 516, in test_groupby_08 
    result_bcolz = fact_bcolz.groupby(groupby_cols, agg_list) 
    File "/home/carst/PycharmProjects/bquery/bquery/ctable.py", line 226, in groupby 
    bool_arr=bool_arr) 
    File "/home/carst/PycharmProjects/bquery/bquery/ctable.py", line 161, in aggregate_groups 
    raise e 
    File "/home/carst/PycharmProjects/bquery/bquery/ctable.py", line 155, in aggregate_groups 
    agg_op) 
    File "bquery/ctable_ext.pyx", line 452, in bquery.ctable_ext.__pyx_fuse_2_0aggregate (bquery/ctable_ext.c:27585) 
    cpdef aggregate(carray ca_input, carray ca_factor, 
    File "bquery/ctable_ext.pyx", line 653, in bquery.ctable_ext.aggregate (bquery/ctable_ext.c:27107) 
    strcpy(element_2, bytes(v)) 
TypeError: 'float' object is not iterable 

나는 매우 분명 뭔가를 내려다해야하지만, 내가 누락 모르겠어요. 어떤 안내 또는 도움도 매우 감사하게 될 것입니다 !!!

는 Python2.X bytes에서 BR

Carst

답변

1

str 별칭 그러므로

>>> bytes(42.0) 
'42.0' 

Python3.X 그러나, bytes보다 다른 것을 제공하는 새로운 생성자를 가지고 int 또는 str은 int를 반복 가능한 것으로 취급합니다. 따라서 오류가 표시됩니다.

>>> help(bytes) 
class bytes(object) 
| bytes(iterable_of_ints) -> bytes 
| bytes(string, encoding[, errors]) -> bytes 
| bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer 
| bytes(int) -> bytes object of size given by the parameter initialized with null bytes 

해결 방법은 사용하는 것입니다

str(v).encode() 

예, 그것은 꽤하지 않고 두 개의 데이터 사본이 필요하지만, 그것은 모두 파이썬 2에서 작동하며 3

+0

내가 키스 수 당신! 여전히 재생중인 것은 "element_1 + '|'입니다. + element_2 "부분에서"str에 바이트를 연결할 수 없습니다 "오류가 발생합니다. 그러나 그것을 b '|' 어느 쪽도 작동하지 않습니다. 몇 가지 대안을 찾고 있습니다. – Carst

+0

그리고 임시 ('|'.encode() 값으로 구분 기호를 붙임으로써 고쳤습니다.) Sergei! – Carst

+0

다행입니다! 오래 전 비슷한 오류로 고생했습니다. :) –