clj-python / libpython-clj

Python bindings for Clojure
Eclipse Public License 2.0
1.05k stars 68 forks source link

how to log python object with timbre #205

Closed vinurs closed 2 years ago

vinurs commented 2 years ago

hello, i call a python function and it returns like this

{'created_at': 'Tue May 17 08:46:48 +0000 2022', 'id': 1526484368063008770, 'id_str': '1526484368063008770'}

then i use clojure.tools.logging can log it correctly, but i use taoensso.timbre, it shows

1. Unhandled java.lang.Exception
   TypeError: unhashable type: 'dict'

                   ffi.clj:  703  libpython-clj2.python.ffi/check-error-throw
                   ffi.clj:  701  libpython-clj2.python.ffi/check-error-throw
                  base.clj:  180  libpython-clj2.python.base/hash-code
                  base.clj:   -1  libpython-clj2.python.base/hash-code
         bridge_as_jvm.clj:  231  libpython-clj2.python.bridge-as-jvm/generic-python-as-map/reify
    APersistentVector.java:  149  clojure.lang.APersistentVector/hashCode
       APersistentMap.java:  110  clojure.lang.APersistentMap/mapHash
       APersistentMap.java:   99  clojure.lang.APersistentMap/hashCode
    ConcurrentHashMap.java:  936  java.util.concurrent.ConcurrentHashMap/get
               encore.cljc: 2164  taoensso.encore$fmemoize$fn__32770/invoke
               timbre.cljc:  656  taoensso.timbre$_log_BANG_$fn__34248$fn__34250/invoke
                Delay.java:   42  clojure.lang.Delay/deref
                Delay.java:   28  clojure.lang.Delay/force
                  core.clj:  767  clojure.core/force
                  core.clj:  763  clojure.core/force
                 core.cljc:   68  taoensso.timbre.appenders.core$println_appender$fn__34043/invoke
               timbre.cljc:  684  taoensso.timbre$_log_BANG_$fn__34248/invoke
   PersistentArrayMap.java:  377  clojure.lang.PersistentArrayMap/kvreduce
                  core.clj: 6847  clojure.core/fn
                  core.clj: 6832  clojure.core/fn
             protocols.clj:  175  clojure.core.protocols/fn/G
                  core.clj: 6858  clojure.core/reduce-kv
                  core.clj: 6849  clojure.core/reduce-kv
               timbre.cljc:  628  taoensso.timbre$_log_BANG_/invokeStatic
               timbre.cljc:  540  taoensso.timbre$_log_BANG_/invoke
                      REPL:  716  app.utils.twitter/eval70285
                      REPL:  716  app.utils.twitter/eval70285
             Compiler.java: 7181  clojure.lang.Compiler/eval
             Compiler.java: 7136  clojure.lang.Compiler/eval
                  core.clj: 3202  clojure.core/eval
                  core.clj: 3198  clojure.core/eval
    interruptible_eval.clj:   87  nrepl.middleware.interruptible-eval/evaluate/fn/fn
                  AFn.java:  152  clojure.lang.AFn/applyToHelper
                  AFn.java:  144  clojure.lang.AFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 1977  clojure.core/with-bindings*
                  core.clj: 1977  clojure.core/with-bindings*
               RestFn.java:  425  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   87  nrepl.middleware.interruptible-eval/evaluate/fn
                  main.clj:  437  clojure.main/repl/read-eval-print/fn
                  main.clj:  437  clojure.main/repl/read-eval-print
                  main.clj:  458  clojure.main/repl/fn
                  main.clj:  458  clojure.main/repl
                  main.clj:  368  clojure.main/repl
               RestFn.java: 1523  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   84  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:   56  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:  152  nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn
                  AFn.java:   22  clojure.lang.AFn/run
               session.clj:  218  nrepl.middleware.session/session-exec/main-loop/fn
               session.clj:  217  nrepl.middleware.session/session-exec/main-loop
                  AFn.java:   22  clojure.lang.AFn/run
               Thread.java:  833  java.lang.Thread/run

how can i use taoensso.timbre to log the object

jjtolton commented 2 years ago

This appears to be a timbre issue. It is attempting to memoize the value. A naive memorization would use built in hashing — creating a checksum for an unhashable object is more complex and less performant. Python dictionaries are not hashable, so the error is not a mistake. You could cast it to a JVM/Clojure hashmap before printing it, but there would be a performance cost in the conversion.

On Wed, Jul 6, 2022 at 10:30 AM vinurs @.***> wrote:

hello, i call a python function and it returns like this

{'created_at': 'Tue May 17 08:46:48 +0000 2022', 'id': 1526484368063008770, 'id_str': '1526484368063008770'}

then i use clojure.tools.logging can log it correctly, but i use taoensso.timbre, it shows

  1. Unhandled java.lang.Exception TypeError: unhashable type: 'dict'

               ffi.clj:  703  libpython-clj2.python.ffi/check-error-throw
               ffi.clj:  701  libpython-clj2.python.ffi/check-error-throw
              base.clj:  180  libpython-clj2.python.base/hash-code
              base.clj:   -1  libpython-clj2.python.base/hash-code
     bridge_as_jvm.clj:  231  libpython-clj2.python.bridge-as-jvm/generic-python-as-map/reify

    APersistentVector.java: 149 clojure.lang.APersistentVector/hashCode APersistentMap.java: 110 clojure.lang.APersistentMap/mapHash APersistentMap.java: 99 clojure.lang.APersistentMap/hashCode ConcurrentHashMap.java: 936 java.util.concurrent.ConcurrentHashMap/get encore.cljc: 2164 taoensso.encore$fmemoize$fn32770/invoke timbre.cljc: 656 taoensso.timbre$_logBANG$fn34248$fn34250/invoke Delay.java: 42 clojure.lang.Delay/deref Delay.java: 28 clojure.lang.Delay/force core.clj: 767 clojure.core/force core.clj: 763 clojure.core/force core.cljc: 68 taoensso.timbre.appenders.core$println_appender$fn34043/invoke timbre.cljc: 684 taoensso.timbre$_logBANG$fn__34248/invoke PersistentArrayMap.java: 377 clojure.lang.PersistentArrayMap/kvreduce core.clj: 6847 clojure.core/fn core.clj: 6832 clojure.core/fn protocols.clj: 175 clojure.core.protocols/fn/G core.clj: 6858 clojure.core/reduce-kv core.clj: 6849 clojure.core/reduce-kv timbre.cljc: 628 taoensso.timbre$_logBANG/invokeStatic timbre.cljc: 540 taoensso.timbre$_logBANG/invoke REPL: 716 app.utils.twitter/eval70285 REPL: 716 app.utils.twitter/eval70285 Compiler.java: 7181 clojure.lang.Compiler/eval Compiler.java: 7136 clojure.lang.Compiler/eval core.clj: 3202 clojure.core/eval core.clj: 3198 clojure.core/eval interruptible_eval.clj: 87 nrepl.middleware.interruptible-eval/evaluate/fn/fn AFn.java: 152 clojure.lang.AFn/applyToHelper AFn.java: 144 clojure.lang.AFn/applyTo core.clj: 667 clojure.core/apply core.clj: 1977 clojure.core/with-bindings core.clj: 1977 clojure.core/with-bindings RestFn.java: 425 clojure.lang.RestFn/invoke interruptible_eval.clj: 87 nrepl.middleware.interruptible-eval/evaluate/fn main.clj: 437 clojure.main/repl/read-eval-print/fn main.clj: 437 clojure.main/repl/read-eval-print main.clj: 458 clojure.main/repl/fn main.clj: 458 clojure.main/repl main.clj: 368 clojure.main/repl RestFn.java: 1523 clojure.lang.RestFn/invoke interruptible_eval.clj: 84 nrepl.middleware.interruptible-eval/evaluate interruptible_eval.clj: 56 nrepl.middleware.interruptible-eval/evaluate interruptible_eval.clj: 152 nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn AFn.java: 22 clojure.lang.AFn/run session.clj: 218 nrepl.middleware.session/session-exec/main-loop/fn session.clj: 217 nrepl.middleware.session/session-exec/main-loop AFn.java: 22 clojure.lang.AFn/run Thread.java: 833 java.lang.Thread/run

how can i use taoensso.timbre to log the object

— Reply to this email directly, view it on GitHub https://github.com/clj-python/libpython-clj/issues/205, or unsubscribe https://github.com/notifications/unsubscribe-auth/ACPJX4Y55QNUO3MZNQDIGATVSWJ6TANCNFSM52Z7MVHQ . You are receiving this because you are subscribed to this thread.Message ID: @.***>

vinurs commented 2 years ago

@jjtolton thanks for ur reply