kevin-toolbox-dev 1.1.2__tar.gz → 1.1.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. kevin-toolbox-dev-1.1.3/PKG-INFO +58 -0
  2. kevin-toolbox-dev-1.1.3/README.md +40 -0
  3. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/__init__.py +2 -2
  4. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/copy_.py +2 -1
  5. kevin-toolbox-dev-1.1.3/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/traverse.py +148 -0
  6. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/value_parser/eval_references.py +15 -6
  7. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/scheduler/strategy_manager.py +30 -14
  8. kevin-toolbox-dev-1.1.3/kevin_toolbox_dev.egg-info/PKG-INFO +58 -0
  9. kevin-toolbox-dev-1.1.2/PKG-INFO +0 -70
  10. kevin-toolbox-dev-1.1.2/README.md +0 -52
  11. kevin-toolbox-dev-1.1.2/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/traverse.py +0 -69
  12. kevin-toolbox-dev-1.1.2/kevin_toolbox_dev.egg-info/PKG-INFO +0 -70
  13. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/__init__.py +0 -0
  14. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/__init__.py +0 -0
  15. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/combinatorial_optimization/__init__.py +0 -0
  16. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/combinatorial_optimization/get_subset_with_largest_product.py +0 -0
  17. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/combinatorial_optimization/test/__init__.py +0 -0
  18. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/combinatorial_optimization/test/test_get_subset_with_largest_product.py +0 -0
  19. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/combinatorial_optimization/test/test_zero_one_knapsack_problem.py +0 -0
  20. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/combinatorial_optimization/zero_one_knapsack_problem.py +0 -0
  21. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_dict/__init__.py +0 -0
  22. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_dict/deep_update.py +0 -0
  23. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/__init__.py +0 -0
  24. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/count_leaf_node_nums.py +0 -0
  25. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/get_hash.py +0 -0
  26. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/get_nodes.py +0 -0
  27. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/get_value_by_name.py +0 -0
  28. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/name_handler/__init__.py +0 -0
  29. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/name_handler/build_name.py +0 -0
  30. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/name_handler/escape_node.py +0 -0
  31. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/name_handler/parse_name.py +0 -0
  32. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/set_value_by_name.py +0 -0
  33. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/value_parser/__init__.py +0 -0
  34. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/value_parser/cal_relation_between_references.py +0 -0
  35. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/value_parser/parse_references.py +0 -0
  36. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_seq/__init__.py +0 -0
  37. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_seq/flatten_list.py +0 -0
  38. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_seq/get_subsets.py +0 -0
  39. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/locks/__init__.py +0 -0
  40. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/locks/mutex_lock.py +0 -0
  41. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/pareto_front/__init__.py +0 -0
  42. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/pareto_front/get_pareto_points_idx.py +0 -0
  43. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/registration/__init__.py +0 -0
  44. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/registration/registry.py +0 -0
  45. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/scheduler/__init__.py +0 -0
  46. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/scheduler/trigger.py +0 -0
  47. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/search/__init__.py +0 -0
  48. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/search/binary_search.py +0 -0
  49. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/statistician/__init__.py +0 -0
  50. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/statistician/_init_var.py +0 -0
  51. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/statistician/average_accumulator.py +0 -0
  52. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/statistician/exponential_moving_average.py +0 -0
  53. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/utils/__init__.py +0 -0
  54. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/data_structure/__init__.py +0 -0
  55. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/data_structure/executor.py +0 -0
  56. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/dangerous/__init__.py +0 -0
  57. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/dangerous/dump_into_pickle_with_executor_attached.py +0 -0
  58. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/__init__.py +0 -0
  59. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/core/__init__.py +0 -0
  60. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/core/cache/__init__.py +0 -0
  61. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/core/cache/cache_manager_for_iterator.py +0 -0
  62. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/core/reader/__init__.py +0 -0
  63. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/core/reader/file_iterative_reader.py +0 -0
  64. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/core/reader/unified_reader.py +0 -0
  65. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/core/reader/unified_reader_base.py +0 -0
  66. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/__init__.py +0 -0
  67. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/json_/__init__.py +0 -0
  68. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/json_/converter/__init__.py +0 -0
  69. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/json_/converter/convert_dict_key_to_number.py +0 -0
  70. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/json_/converter/convert_ndarray_to_list.py +0 -0
  71. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/json_/converter/integrate.py +0 -0
  72. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/json_/read_json.py +0 -0
  73. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/json_/write_json.py +0 -0
  74. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/__init__.py +0 -0
  75. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/converter.py +0 -0
  76. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/kevin_notation_reader.py +0 -0
  77. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/kevin_notation_writer.py +0 -0
  78. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/read.py +0 -0
  79. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/test/__init__.py +0 -0
  80. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/test/test_data/__init__.py +0 -0
  81. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/test/test_data/data_0.py +0 -0
  82. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/test/test_data/data_all.py +0 -0
  83. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/test/test_kevin_notation.py +0 -0
  84. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/write.py +0 -0
  85. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/__init__.py +0 -0
  86. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/decorator/__init__.py +0 -0
  87. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/decorator/restore_original_work_path.py +0 -0
  88. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/__init__.py +0 -0
  89. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/producer_consumer/__init__.py +0 -0
  90. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/producer_consumer/consumer.py +0 -0
  91. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/producer_consumer/for_cvf.py +0 -0
  92. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/producer_consumer/getter.py +0 -0
  93. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/producer_consumer/graph.py +0 -0
  94. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/producer_consumer/node.py +0 -0
  95. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/producer_consumer/producer.py +0 -0
  96. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/producer_consumer/sender.py +0 -0
  97. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/singleton/__init__.py +0 -0
  98. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/singleton/singleton_for_uid.py +0 -0
  99. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/general_matrix_multiplication.py +0 -0
  100. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/numerical_characteristics/__init__.py +0 -0
  101. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/numerical_characteristics/iou.py +0 -0
  102. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/temperate/__init__.py +0 -0
  103. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/temperate/iterator_base.py +0 -0
  104. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/temperate/my_iterator.py +0 -0
  105. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/temperate/my_iterator_base.py +0 -0
  106. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/temperate/sequence_map_base.py +0 -0
  107. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/test.py +0 -0
  108. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/env_info/__init__.py +0 -0
  109. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/env_info/check_validity_and_uninstall.py +0 -0
  110. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/env_info/check_version_and_update.py +0 -0
  111. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/env_info/test/__init__.py +0 -0
  112. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/env_info/test/test_version.py +0 -0
  113. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/env_info/version/__init__.py +0 -0
  114. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/env_info/version/compare_version.py +0 -0
  115. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/env_info/version/parse_version.py +0 -0
  116. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/env_info/version/sort_version_ls.py +0 -0
  117. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/__init__.py +0 -0
  118. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/__init__.py +0 -0
  119. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/__old_version/__init__.py +0 -0
  120. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/__old_version/cal_iou_between_box.py +0 -0
  121. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/boolean_algebra_for_boxes.py +0 -0
  122. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/cal_area_of_boxes.py +0 -0
  123. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/cal_iou_between_boxes.py +0 -0
  124. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/convert_boxes_from_coord_to_grid_index.py +0 -0
  125. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/detect_collision.py +0 -0
  126. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/detect_collision_among_boxes_ls.py +0 -0
  127. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/detect_collision_inside_boxes.py +0 -0
  128. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/detect_overlap.py +0 -0
  129. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/get_ticks_of_boxes.py +0 -0
  130. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/__init__.py +0 -0
  131. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/__init__.py +0 -0
  132. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/__init__.py +0 -0
  133. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/analysis/__init__.py +0 -0
  134. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/analysis/get_fail_case_from_iterator.py +0 -0
  135. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/dummy/__init__.py +0 -0
  136. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/dummy/dummy_data.py +0 -0
  137. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/__init__.py +0 -0
  138. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/build_generator.py +0 -0
  139. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/build_iterator.py +0 -0
  140. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/factory.py +0 -0
  141. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/get_executor_ls/__by_block/__init__.py +0 -0
  142. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/get_executor_ls/__by_block/along_axis.py +0 -0
  143. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/get_executor_ls/__by_block/along_diagonal.py +0 -0
  144. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/get_executor_ls/__by_block/of_all.py +0 -0
  145. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/get_executor_ls/__by_block/of_triangle.py +0 -0
  146. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/get_executor_ls/__init__.py +0 -0
  147. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/get_executor_ls/by_block.py +0 -0
  148. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/get_executor_ls/by_samples.py +0 -0
  149. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/merge.py +0 -0
  150. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/statistician/__init__.py +0 -0
  151. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/statistician/binary_classification/__init__.py +0 -0
  152. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/statistician/binary_classification/confusion_matrices/__init__.py +0 -0
  153. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/statistician/binary_classification/confusion_matrices/accumulator_for_cfm.py +0 -0
  154. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/statistician/binary_classification/confusion_matrices/cal_cfm.py +0 -0
  155. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/statistician/binary_classification/confusion_matrices/cal_cfm_iteratively_by_chunk.py +0 -0
  156. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/statistician/binary_classification/confusion_matrices/cal_tpr_and_fpr.py +0 -0
  157. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/statistician/binary_classification/confusion_matrices/convert.py +0 -0
  158. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/statistician/binary_classification/confusion_matrices/merge_cfm_ls.py +0 -0
  159. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/__init__.py +0 -0
  160. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/__init__.py +0 -0
  161. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/concat_and_split/__init__.py +0 -0
  162. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/concat_and_split/computational_tree.py +0 -0
  163. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/concat_and_split/concat_crops_into_whole.py +0 -0
  164. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/concat_and_split/split_whole_into_crops.py +0 -0
  165. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/coordinates/__init__.py +0 -0
  166. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/coordinates/convert/__init__.py +0 -0
  167. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/coordinates/convert/convert_format.py +0 -0
  168. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/coordinates/generate/__init__.py +0 -0
  169. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/coordinates/generate/generate_integrated_api.py +0 -0
  170. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/coordinates/generate/generate_shuffled_index_ls.py +0 -0
  171. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/coordinates/generate/generate_z_pattern_indices_ls.py +0 -0
  172. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/coordinates/generate/normal_indices_generator.py +0 -0
  173. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/reshape/__init__.py +0 -0
  174. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/reshape/flatten_along_pattern.py +0 -0
  175. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/reshape/merge_blocks.py +0 -0
  176. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/reshape/split_blocks.py +0 -0
  177. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/reshape/unflatten_along_pattern.py +0 -0
  178. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/transpose/__init__.py +0 -0
  179. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/transpose/get_inverse_of_transpose_index_ls.py +0 -0
  180. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/transpose/transpose_inside_axis.py +0 -0
  181. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/number_theory/__init__.py +0 -0
  182. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/number_theory/cache.py +0 -0
  183. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/number_theory/get_greatest_common_divisor.py +0 -0
  184. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/number_theory/get_primes.py +0 -0
  185. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/number_theory/prime_factorization.py +0 -0
  186. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/number_theory/test/__init__.py +0 -0
  187. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/number_theory/test/test_get_greatest_common_divisor.py +0 -0
  188. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/number_theory/test/test_get_primes.py +0 -0
  189. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/number_theory/test/test_prime_factorization.py +0 -0
  190. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/transform/__init__.py +0 -0
  191. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/transform/dct/__init__.py +0 -0
  192. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/transform/dct/dct_calculator.py +0 -0
  193. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/transform/dct/generate_dct_trans_matrix.py +0 -0
  194. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/transform/scaling_and_shift/__init__.py +0 -0
  195. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/transform/scaling_and_shift/scaling.py +0 -0
  196. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/utils/__init__.py +0 -0
  197. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/utils/convert_dtype.py +0 -0
  198. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/utils/get_crop_by_box.py +0 -0
  199. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/utils/get_function_table_for_array_and_tensor.py +0 -0
  200. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/utils/set_crop_by_box.py +0 -0
  201. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/utils/spilt_integer_most_evenly.py +0 -0
  202. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/__init__.py +0 -0
  203. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_matplotlib/__init__.py +0 -0
  204. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_matplotlib/add_trajectory_2d.py +0 -0
  205. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_matplotlib/add_trajectory_3d.py +0 -0
  206. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_matplotlib/arrow3d.py +0 -0
  207. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_numpy/__init__.py +0 -0
  208. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_numpy/linalg/__init__.py +0 -0
  209. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_numpy/linalg/cos_similar.py +0 -0
  210. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_numpy/linalg/normalize.py +0 -0
  211. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_numpy/linalg/softmax.py +0 -0
  212. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_optuna/__init__.py +0 -0
  213. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_optuna/sample_from_feasible_domain.py +0 -0
  214. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_os/__init__.py +0 -0
  215. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_os/remove.py +0 -0
  216. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_test/__init__.py +0 -0
  217. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_test/check_consistency.py +0 -0
  218. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/__init__.py +0 -0
  219. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/compatible/__init__.py +0 -0
  220. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/compatible/concat.py +0 -0
  221. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/compatible/linalg/__init__.py +0 -0
  222. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/compatible/linalg/norm.py +0 -0
  223. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/compatible/linalg/svd.py +0 -0
  224. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/compatible/nn/__init__.py +0 -0
  225. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/compatible/nn/sequential.py +0 -0
  226. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/compatible/tile.py +0 -0
  227. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/compatible/where.py +0 -0
  228. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/math/__init__.py +0 -0
  229. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/math/get_y_at_x.py +0 -0
  230. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/math/my_around.py +0 -0
  231. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/nn/__init__.py +0 -0
  232. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/nn/lambda_layer.py +0 -0
  233. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox_dev.egg-info/SOURCES.txt +0 -0
  234. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox_dev.egg-info/dependency_links.txt +0 -0
  235. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox_dev.egg-info/requires.txt +0 -0
  236. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/kevin_toolbox_dev.egg-info/top_level.txt +0 -0
  237. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/pyproject.toml +0 -0
  238. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/setup.cfg +0 -0
  239. {kevin-toolbox-dev-1.1.2 → kevin-toolbox-dev-1.1.3}/setup.py +0 -0
@@ -0,0 +1,58 @@
1
+ Metadata-Version: 2.1
2
+ Name: kevin-toolbox-dev
3
+ Version: 1.1.3
4
+ Summary: 一个常用的工具代码包集合
5
+ Home-page: https://github.com/cantbeblank96/kevin_toolbox
6
+ Download-URL: https://github.com/username/your-package/archive/refs/tags/v1.0.0.tar.gz
7
+ Author: kevin hsu
8
+ Author-email: xukaiming1996@163.com
9
+ License: MIT
10
+ Keywords: mathematics,pytorch,numpy,machine-learning,algorithm
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Programming Language :: Python
13
+ Classifier: Programming Language :: Python :: 3
14
+ Requires-Python: >=3.6
15
+ Description-Content-Type: text/markdown
16
+ Provides-Extra: plot
17
+ Provides-Extra: rest
18
+
19
+ # kevin_toolbox
20
+
21
+ 一个通用的工具代码包集合
22
+
23
+
24
+
25
+ 环境要求
26
+
27
+ ```shell
28
+ numpy>=1.19
29
+ pytorch>=1.2
30
+ ```
31
+
32
+ 安装方法:
33
+
34
+ ```shell
35
+ pip install kevin-toolbox --no-dependencies
36
+ ```
37
+
38
+
39
+
40
+ [项目地址 Repo](https://github.com/cantbeblank96/kevin_toolbox)
41
+
42
+ [使用指南 User_Guide](./notes/User_Guide.md)
43
+
44
+ [免责声明 Disclaimer](./notes/Disclaimer.md)
45
+
46
+ [版本更新记录](./notes/Release_Record.md):
47
+
48
+ - v 1.1.3(2023-06-30)
49
+ - computer_science.algorithm.for_nested_dict_list
50
+ - 在 traverse() 中新增了traversal_mode 参数用于控制遍历的顺序,目前支持三种模式: "dfs_pre_order" 深度优先-先序遍历、"dfs_post_order" 深度优先-后序遍历、以及 "bfs" 宽度优先。
51
+ - 在单元测试中新增了对 traverse() 中 traversal_mode 参数的测试项目。
52
+ - value_parser
53
+ - 修改 eval_references() 中 converter_for_ref 参数的行为,从原来只是作为计算结果前对算式中引用节点值的预处理,变成直接改变被引用节点的值。亦即原来不会修改原被引用节点的值,现在变为会修改原节点的值了。
54
+ - computer_science.algorithm.scheduler
55
+ - 改进 Strategy_Manager
56
+ - 使用 `<eval>` 来标记需要使用 eval() 函数读取的字符串。相对于旧版通过 `<eval>` 来标记需要被读取为函数的字符串,使用 `<eval>` 不仅可以读取函数,也可以读取更多的数据结构。
57
+ - 在通过 add() 添加策略时即对 strategy 中被 `<eval>` 标记的键值进行解释,而非等到后续每次 cal() 时再进行解释,提高了效率。
58
+ - 修改了对应的单元测试。
@@ -0,0 +1,40 @@
1
+ # kevin_toolbox
2
+
3
+ 一个通用的工具代码包集合
4
+
5
+
6
+
7
+ 环境要求
8
+
9
+ ```shell
10
+ numpy>=1.19
11
+ pytorch>=1.2
12
+ ```
13
+
14
+ 安装方法:
15
+
16
+ ```shell
17
+ pip install kevin-toolbox --no-dependencies
18
+ ```
19
+
20
+
21
+
22
+ [项目地址 Repo](https://github.com/cantbeblank96/kevin_toolbox)
23
+
24
+ [使用指南 User_Guide](./notes/User_Guide.md)
25
+
26
+ [免责声明 Disclaimer](./notes/Disclaimer.md)
27
+
28
+ [版本更新记录](./notes/Release_Record.md):
29
+
30
+ - v 1.1.3(2023-06-30)
31
+ - computer_science.algorithm.for_nested_dict_list
32
+ - 在 traverse() 中新增了traversal_mode 参数用于控制遍历的顺序,目前支持三种模式: "dfs_pre_order" 深度优先-先序遍历、"dfs_post_order" 深度优先-后序遍历、以及 "bfs" 宽度优先。
33
+ - 在单元测试中新增了对 traverse() 中 traversal_mode 参数的测试项目。
34
+ - value_parser
35
+ - 修改 eval_references() 中 converter_for_ref 参数的行为,从原来只是作为计算结果前对算式中引用节点值的预处理,变成直接改变被引用节点的值。亦即原来不会修改原被引用节点的值,现在变为会修改原节点的值了。
36
+ - computer_science.algorithm.scheduler
37
+ - 改进 Strategy_Manager
38
+ - 使用 `<eval>` 来标记需要使用 eval() 函数读取的字符串。相对于旧版通过 `<eval>` 来标记需要被读取为函数的字符串,使用 `<eval>` 不仅可以读取函数,也可以读取更多的数据结构。
39
+ - 在通过 add() 添加策略时即对 strategy 中被 `<eval>` 标记的键值进行解释,而非等到后续每次 cal() 时再进行解释,提高了效率。
40
+ - 修改了对应的单元测试。
@@ -1,4 +1,4 @@
1
- __version__ = "1.1.2"
1
+ __version__ = "1.1.3"
2
2
 
3
3
 
4
4
  import os
@@ -12,5 +12,5 @@ os.system(
12
12
  os.system(
13
13
  f'python {os.path.split(__file__)[0]}/env_info/check_validity_and_uninstall.py '
14
14
  f'--package_name kevin-toolbox-dev '
15
- f'--expiration_timestamp 1703415924 --verbose 0'
15
+ f'--expiration_timestamp 1703667553 --verbose 0'
16
16
  )
@@ -16,7 +16,8 @@ def copy_(var, b_deepcopy=False):
16
16
  return copy.deepcopy(var)
17
17
 
18
18
  return traverse(var=[var], match_cond=lambda _, __, value: isinstance(value, (list, dict,)),
19
- action_mode="replace", converter=lambda _, value: value.copy(), b_traverse_matched_element=True)[0]
19
+ action_mode="replace", converter=lambda _, value: value.copy(),
20
+ traversal_mode="dfs_pre_order", b_traverse_matched_element=True)[0]
20
21
 
21
22
 
22
23
  if __name__ == '__main__':
@@ -0,0 +1,148 @@
1
+ from enum import Enum
2
+ from kevin_toolbox.computer_science.algorithm.for_nested_dict_list.name_handler import escape_node
3
+
4
+
5
+ class ACTION_MODE(Enum):
6
+ remove = 1
7
+ replace = 2
8
+ skip = 3
9
+
10
+
11
+ class TRAVERSAL_MODE(Enum):
12
+ dfs_pre_order = 1
13
+ dfs_post_order = 2
14
+ bfs = 3
15
+
16
+
17
+ def traverse(var, match_cond, action_mode="remove", converter=None,
18
+ b_use_name_as_idx=False, traversal_mode="dfs_pre_order", b_traverse_matched_element=False):
19
+ """
20
+ 遍历 var 找到符合 match_cond 的元素,将其按照 action_mode 指定的操作进行处理
21
+
22
+ 参数:
23
+ var: 待处理数据
24
+ 当 var 不是 dict 或者 list 时,将直接返回 var 而不做处理
25
+ match_cond: <func> 元素的匹配条件
26
+ 函数类型为 def(parent_type, idx, value): ...
27
+ 其中:
28
+ parent_type 该元素源自哪种结构体,有两个可能传入的值: list,dict
29
+ idx 该元素在结构体中的位置
30
+ 当 b_use_name_as_idx=False 时,
31
+ 对于列表是 index,对于字典是 key
32
+ 当为 True 时,传入的是元素在整体结构中的 name 位置,name的格式和含义参考
33
+ name_handler.parse_name() 中的介绍
34
+ value 元素的值
35
+ action_mode: <str> 如何对匹配上的元素进行处理
36
+ 目前支持:
37
+ "remove" 将该元素移除
38
+ "replace" 将该元素替换为 converter() 处理后的结果
39
+ "skip": 不进行任何操作
40
+ converter: <func> 参见 action_mode 中的 "replace" 模式
41
+ 函数类型为 def(idx, value): ...
42
+ 其中 idx 和 value 的含义参见参数 match_cond 介绍
43
+ traversal_mode: <str> 遍历的模式、顺序
44
+ 目前支持:
45
+ "dfs_pre_order" 深度优先、先序遍历
46
+ "dfs_post_order" 深度优先、后序遍历
47
+ "bfs" 宽度优先
48
+ 默认为 "dfs_pre_order"
49
+ b_use_name_as_idx: <boolean> 对于 match_cond/converter 中的 idx 参数,是传入整体的 name 还是父节点的 index 或 key。
50
+ 默认为 False
51
+ b_traverse_matched_element <boolean> 对于匹配上的元素,经过处理后,是否继续遍历该元素的内容
52
+ 默认为 False
53
+ """
54
+ assert callable(match_cond)
55
+ assert action_mode in ACTION_MODE.__members__.keys()
56
+ action_mode = ACTION_MODE.__members__[action_mode]
57
+ if action_mode is ACTION_MODE.replace:
58
+ assert callable(converter)
59
+ #
60
+ assert traversal_mode in TRAVERSAL_MODE.__members__.keys()
61
+ traversal_mode = TRAVERSAL_MODE.__members__[traversal_mode]
62
+
63
+ if traversal_mode is TRAVERSAL_MODE.bfs:
64
+ return _bfs(var, match_cond, action_mode, converter, b_use_name_as_idx, b_traverse_matched_element)
65
+ else:
66
+ return _dfs(var, match_cond, action_mode, converter, b_use_name_as_idx, traversal_mode,
67
+ b_traverse_matched_element, "")
68
+
69
+
70
+ def _bfs(var, match_cond, action_mode, converter, b_use_name_as_idx, b_traverse_matched_element):
71
+ temp = [("", var)]
72
+
73
+ while len(temp):
74
+ pre_name, i = temp.pop(0)
75
+ if isinstance(i, (list, dict)):
76
+ keys = list(range(len(i)) if isinstance(i, list) else i.keys())
77
+ keys.reverse() # 反过来便于 列表 弹出元素
78
+ idx_ls = _gen_idx(i, keys, b_use_name_as_idx, pre_name)
79
+
80
+ # 匹配&处理
81
+ for k, idx in zip(keys, idx_ls):
82
+ b_matched, b_popped = _deal(i, k, idx, match_cond, converter, action_mode)
83
+ if b_popped or (b_matched and not b_traverse_matched_element):
84
+ continue
85
+ # 添加到队尾
86
+ temp.append((idx, i[k]))
87
+
88
+ return var
89
+
90
+
91
+ def _dfs(var, match_cond, action_mode, converter,
92
+ b_use_name_as_idx, traversal_mode, b_traverse_matched_element, pre_name):
93
+ if isinstance(var, (list, dict)):
94
+ keys = list(range(len(var)) if isinstance(var, list) else var.keys())
95
+ keys.reverse() # 反过来便于 列表 弹出元素
96
+ idx_ls = _gen_idx(var, keys, b_use_name_as_idx, pre_name)
97
+
98
+ #
99
+ if traversal_mode is TRAVERSAL_MODE.dfs_pre_order:
100
+ # 先序
101
+ # 匹配&处理
102
+ deal_res_ls = []
103
+ for k, idx in zip(keys, idx_ls):
104
+ deal_res_ls.append(_deal(var, k, idx, match_cond, converter, action_mode))
105
+ # 递归遍历
106
+ for (b_matched, b_popped), k, idx in zip(deal_res_ls, keys, idx_ls):
107
+ if b_popped or (b_matched and not b_traverse_matched_element):
108
+ continue
109
+ var[k] = _dfs(var[k], match_cond, action_mode, converter, b_use_name_as_idx, traversal_mode,
110
+ b_traverse_matched_element, idx)
111
+ else:
112
+ # 后序
113
+ # 递归遍历
114
+ for k, idx in zip(keys, idx_ls):
115
+ var[k] = _dfs(var[k], match_cond, action_mode, converter, b_use_name_as_idx, traversal_mode,
116
+ b_traverse_matched_element, idx)
117
+ # 匹配&处理
118
+ for k, idx in zip(keys, idx_ls):
119
+ _deal(var, k, idx, match_cond, converter, action_mode)
120
+ else:
121
+ pass
122
+ return var
123
+
124
+
125
+ def _deal(var, k, idx, match_cond, converter, action_mode):
126
+ """处理节点"""
127
+ # 匹配
128
+ b_matched = match_cond(type(var), idx, var[k])
129
+ b_popped = False
130
+ # 处理
131
+ if b_matched:
132
+ if action_mode is ACTION_MODE.remove:
133
+ var.pop(k)
134
+ b_popped = True
135
+ elif action_mode is ACTION_MODE.replace:
136
+ var[k] = converter(idx, var[k])
137
+ else:
138
+ pass
139
+ return b_matched, b_popped
140
+
141
+
142
+ def _gen_idx(var, keys, b_use_name_as_idx, pre_name):
143
+ if b_use_name_as_idx:
144
+ method = "@" if isinstance(var, list) else ":"
145
+ idx_ls = [f'{pre_name}{method}{escape_node(node=k, b_reversed=False, times=1)}' for k in keys]
146
+ else:
147
+ idx_ls = keys
148
+ return idx_ls
@@ -9,8 +9,12 @@ def eval_references(var, node_s, order, converter_for_ref=None, converter_for_re
9
9
  var:
10
10
  node_s: <dict> 引用节点,parse_references() 返回的结果
11
11
  order: <list of name> 计算顺序,cal_relation_between_references() 返回的结果
12
- converter_for_ref: <callable> 对引用值施加何种处理
13
- 形如 def(idx, v): ... 的函数,其中 idx 是被引用节点的名字,v是其值
12
+ converter_for_ref: <callable> 对被引用节点施加何种处理
13
+ 形如 def(idx, v): ... 的函数,其中 idx 是被引用节点的名字,v是其值,
14
+ 返回的结果将替换掉被引用节点中原来的值。
15
+ 注意:
16
+ - 处理后得到的结果将替换掉原引用节点的值。(重要所以说两次)
17
+ - 当同一节点被多次引用时,仅会被处理、替换一次。
14
18
  converter_for_res: <callable> 对计算结果施加何种处理
15
19
  形如 def(idx, v): ... 的函数,其中 idx 是节点的名字,v是计算结果
16
20
  """
@@ -18,13 +22,18 @@ def eval_references(var, node_s, order, converter_for_ref=None, converter_for_re
18
22
  assert converter_for_ref is None or callable(converter_for_ref)
19
23
  assert converter_for_res is None or callable(converter_for_res)
20
24
 
25
+ processed_ref_nodes = set()
26
+
21
27
  for name in order:
22
28
  details = node_s[name]
23
29
  # 获取依赖值
24
- for k, v in details["paras"].items():
25
- v_new = get_value_by_name(var=var, name=v)
26
- if converter_for_ref is not None:
27
- v_new = converter_for_ref(v, v_new)
30
+ for k, idx in details["paras"].items():
31
+ v_new = get_value_by_name(var=var, name=idx)
32
+ if converter_for_ref is not None and idx not in processed_ref_nodes:
33
+ v_new = converter_for_ref(idx, v_new)
34
+ # 赋值
35
+ set_value_by_name(var=var, name=idx, value=v_new, b_force=False)
36
+ processed_ref_nodes.add(idx)
28
37
  details["paras"][k] = v_new
29
38
  # 计算
30
39
  res = eval(details["expression"], details["paras"])
@@ -2,7 +2,7 @@ import random
2
2
  import torch
3
3
  import numpy as np
4
4
  import copy
5
- from kevin_toolbox.computer_science.algorithm.for_nested_dict_list import set_value_by_name, get_value_by_name
5
+ from kevin_toolbox.computer_science.algorithm.for_nested_dict_list import set_value_by_name, get_value_by_name, traverse
6
6
 
7
7
 
8
8
  class Strategy_Manager:
@@ -20,9 +20,9 @@ class Strategy_Manager:
20
20
  ":lr": {
21
21
  # 当 key 满足 trigger_value 时,将 ":lr" 指向的部分替换为 value
22
22
  0: 0.1,
23
- # 如果是以 <f> 为开头的字符串,则视为函数并将 value 解释为函数执行后的结果
23
+ # 如果是以 <eval> 为开头的字符串,则视为函数并将 value 解释为函数执行后的结果
24
24
  # 函数中 t, p 参数将被分别传入 trigger_value 和 para_value
25
- "<f>lambda t: t%100==0": "<f>lambda p, t: p*0.1",
25
+ "<eval>lambda t: t%100==0": "<eval>lambda p, t: p*0.1",
26
26
  },
27
27
  },
28
28
  override=False,
@@ -93,10 +93,11 @@ class Strategy_Manager:
93
93
  300: {
94
94
  ":ratio_ls@1": 1e-5,
95
95
  }, # 在 epoch=300 时,将 ratio_ls[1] 设置为 1e-5
96
- "<f>lambda t: t%100==0": {
97
- ":lr": "<f>lambda p, t: p*0.1",
98
- }, # 当键为 string 且 开头带有 <f> 标记时候,将以函数的方式读取该字符串,
99
- # 并在匹配过程中向该函数输入触发值 t 和当前元素的值 p,当函数返回True视为匹配成功。
96
+ "<eval>lambda t: t%100==0": {
97
+ ":lr": "<eval>lambda p, t: p*0.1",
98
+ }, # 当键为 string 且 开头带有 <eval> 标记时候,将使用 eval() 函数读取该字符串,
99
+ # 当键为 callable 的函数时,在匹配过程中向该函数输入触发值 t 和当前元素的值 p
100
+ # 当函数返回True视为匹配成功。
100
101
  # 比如上式表示的是:每经过 100 epoch,也就是当 epoch%100==0 时,lr 在原来的基础上乘上0.1。
101
102
  # 函数匹配的的优先级低于直接的值匹配。
102
103
  ...
@@ -109,7 +110,7 @@ class Strategy_Manager:
109
110
  "__trigger_name": "epoch",
110
111
  ":lr": {
111
112
  0: 0.1,
112
- "<f>lambda t: t%100==0": "<f>lambda p, t: p*0.1",
113
+ "<eval>lambda t: t%100==0": "<eval>lambda p, t: p*0.1",
113
114
  },
114
115
  ":ratio_ls": {
115
116
  0: [1e-3, 1e-2],
@@ -146,6 +147,21 @@ class Strategy_Manager:
146
147
  temp[t_key][p_key] = strategy[p_key][t_key]
147
148
  strategy = temp
148
149
 
150
+ def deal_eval_str(x):
151
+ return eval(x[6:]) if isinstance(x, (str,)) and x.startswith("<eval>") else x
152
+
153
+ # 使用 eval() 读取带 "<eval>" 标签的键or值
154
+ def converter(_, value):
155
+ if isinstance(value, (dict,)):
156
+ res = {deal_eval_str(k): deal_eval_str(v) for k, v in value.items()}
157
+ else:
158
+ res = deal_eval_str(value)
159
+ return res
160
+
161
+ strategy = traverse(var=[strategy], match_cond=lambda _, __, value: isinstance(value, (dict, str,)),
162
+ action_mode="replace", converter=converter, traversal_mode="dfs_post_order",
163
+ b_use_name_as_idx=False, b_traverse_matched_element=True)[0]
164
+
149
165
  # 将策略添加到 database
150
166
  old_strategy = self.database.get(_trigger_name, dict())
151
167
  for t_key, item in strategy.items():
@@ -187,7 +203,7 @@ class Strategy_Manager:
187
203
  action_s = dict() # {p_name: p_value, ...}
188
204
  # 使用匹配函数
189
205
  for key, p_s in strategy.items():
190
- if isinstance(key, (str,)) and key.startswith("<f>") and eval(key[3:])(t_value):
206
+ if callable(key) and key(t_value):
191
207
  action_s.update({i: j for i, j in p_s.items() if i not in action_s})
192
208
  # 直接匹配
193
209
  if t_value in strategy:
@@ -200,9 +216,9 @@ class Strategy_Manager:
200
216
  for t_name, action_s in sorted(action_s_all.items(), key=lambda x: x[0]):
201
217
  t_value = trigger_state[t_name]
202
218
  for name, p_value in copy.deepcopy(action_s):
203
- if isinstance(p_value, (str,)) and p_value.startswith("<f>"):
219
+ if callable(p_value):
204
220
  raw_value = get_value_by_name(var=var, name=name)
205
- p_value = eval(p_value[3:])(raw_value, t_value)
221
+ p_value = p_value(raw_value, t_value)
206
222
  set_value_by_name(var=var, name=name, value=p_value)
207
223
 
208
224
  return var, action_s_all
@@ -217,7 +233,7 @@ if __name__ == '__main__':
217
233
  "__trigger_name": "epoch",
218
234
  ":lr": {
219
235
  # 0: 0.1,
220
- "<f>lambda t: t%100==0": "<f>lambda p, t: p*0.1",
236
+ "<eval>lambda t: t%100==0": "<eval>lambda p, t: p*0.1",
221
237
  },
222
238
  })
223
239
  sm.add(strategy={
@@ -230,8 +246,8 @@ if __name__ == '__main__':
230
246
  300: {
231
247
  ":ratio_ls@1": 1e-5,
232
248
  },
233
- # "<f>lambda t: t%100==0": {
234
- # ":lr": "<f>lambda p, t: p*0.1",
249
+ # "<eval>lambda t: t%100==0": {
250
+ # ":lr": "<eval>lambda p, t: p*0.1",
235
251
  # },
236
252
  }, override=False)
237
253
 
@@ -0,0 +1,58 @@
1
+ Metadata-Version: 2.1
2
+ Name: kevin-toolbox-dev
3
+ Version: 1.1.3
4
+ Summary: 一个常用的工具代码包集合
5
+ Home-page: https://github.com/cantbeblank96/kevin_toolbox
6
+ Download-URL: https://github.com/username/your-package/archive/refs/tags/v1.0.0.tar.gz
7
+ Author: kevin hsu
8
+ Author-email: xukaiming1996@163.com
9
+ License: MIT
10
+ Keywords: mathematics,pytorch,numpy,machine-learning,algorithm
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Programming Language :: Python
13
+ Classifier: Programming Language :: Python :: 3
14
+ Requires-Python: >=3.6
15
+ Description-Content-Type: text/markdown
16
+ Provides-Extra: plot
17
+ Provides-Extra: rest
18
+
19
+ # kevin_toolbox
20
+
21
+ 一个通用的工具代码包集合
22
+
23
+
24
+
25
+ 环境要求
26
+
27
+ ```shell
28
+ numpy>=1.19
29
+ pytorch>=1.2
30
+ ```
31
+
32
+ 安装方法:
33
+
34
+ ```shell
35
+ pip install kevin-toolbox --no-dependencies
36
+ ```
37
+
38
+
39
+
40
+ [项目地址 Repo](https://github.com/cantbeblank96/kevin_toolbox)
41
+
42
+ [使用指南 User_Guide](./notes/User_Guide.md)
43
+
44
+ [免责声明 Disclaimer](./notes/Disclaimer.md)
45
+
46
+ [版本更新记录](./notes/Release_Record.md):
47
+
48
+ - v 1.1.3(2023-06-30)
49
+ - computer_science.algorithm.for_nested_dict_list
50
+ - 在 traverse() 中新增了traversal_mode 参数用于控制遍历的顺序,目前支持三种模式: "dfs_pre_order" 深度优先-先序遍历、"dfs_post_order" 深度优先-后序遍历、以及 "bfs" 宽度优先。
51
+ - 在单元测试中新增了对 traverse() 中 traversal_mode 参数的测试项目。
52
+ - value_parser
53
+ - 修改 eval_references() 中 converter_for_ref 参数的行为,从原来只是作为计算结果前对算式中引用节点值的预处理,变成直接改变被引用节点的值。亦即原来不会修改原被引用节点的值,现在变为会修改原节点的值了。
54
+ - computer_science.algorithm.scheduler
55
+ - 改进 Strategy_Manager
56
+ - 使用 `<eval>` 来标记需要使用 eval() 函数读取的字符串。相对于旧版通过 `<eval>` 来标记需要被读取为函数的字符串,使用 `<eval>` 不仅可以读取函数,也可以读取更多的数据结构。
57
+ - 在通过 add() 添加策略时即对 strategy 中被 `<eval>` 标记的键值进行解释,而非等到后续每次 cal() 时再进行解释,提高了效率。
58
+ - 修改了对应的单元测试。
@@ -1,70 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: kevin-toolbox-dev
3
- Version: 1.1.2
4
- Summary: 一个常用的工具代码包集合
5
- Home-page: https://github.com/cantbeblank96/kevin_toolbox
6
- Download-URL: https://github.com/username/your-package/archive/refs/tags/v1.0.0.tar.gz
7
- Author: kevin hsu
8
- Author-email: xukaiming1996@163.com
9
- License: MIT
10
- Keywords: mathematics,pytorch,numpy,machine-learning,algorithm
11
- Classifier: License :: OSI Approved :: MIT License
12
- Classifier: Programming Language :: Python
13
- Classifier: Programming Language :: Python :: 3
14
- Requires-Python: >=3.6
15
- Description-Content-Type: text/markdown
16
- Provides-Extra: plot
17
- Provides-Extra: rest
18
-
19
- # kevin_toolbox
20
-
21
- 一个通用的工具代码包集合
22
-
23
-
24
-
25
- 环境要求
26
-
27
- ```shell
28
- numpy>=1.19
29
- pytorch>=1.2
30
- ```
31
-
32
- 安装方法:
33
-
34
- ```shell
35
- pip install kevin-toolbox --no-dependencies
36
- ```
37
-
38
-
39
-
40
- [项目地址 Repo](https://github.com/cantbeblank96/kevin_toolbox)
41
-
42
- [使用指南 User_Guide](./notes/User_Guide.md)
43
-
44
- [免责声明 Disclaimer](./notes/Disclaimer.md)
45
-
46
- [版本更新记录](./notes/Release_Record.md):
47
-
48
- - v 1.1.2(2023-06-27)【bug fix】
49
-
50
- - computer_science.algorithm.for_nested_dict_list
51
- - 改进 get_value_by_name()
52
- - 新增了参数 b_pop 用于支持取值的同时将该值从 var 中移除
53
- - 新增了参数 default 用于设置取值失败时是报错还是返回默认值
54
- - computer_science.algorithm.registration
55
- - Registry
56
- - 【bug fix】修复了问题:当已有实例的 uid 为正整数 n,同时 cls.__counter 为 n 时,不指定 uid 再创建实例将错误地返回 uid=n 的已有实例而不是新建一个。
57
- - 将 self.pop() 函数的功能合并到 self.get(... ,b_pop=...) 中
58
- - computer_science.algorithm.scheduler
59
- - 改进 Trigger
60
- - 使用 Registry 来管理触发目标
61
- - 新增 self.unbind() 函数来解除绑定
62
- - 在 update_by_state() 中新增了 target_names 参数来决定调用哪些目标
63
- - 新增 Trigger 的状态管理相关函数
64
- - self.clear_state_dict(): 清除 Trigger 中保存的状态
65
- - self.load_state_dict(): 加载
66
- - self.state_dict(): 获取
67
- - load_state_dict 和 state_dict 的接口名称是为了和 pytorch 中模型、优化器的状态加载、获取保持一致。
68
-
69
-
70
-
@@ -1,52 +0,0 @@
1
- # kevin_toolbox
2
-
3
- 一个通用的工具代码包集合
4
-
5
-
6
-
7
- 环境要求
8
-
9
- ```shell
10
- numpy>=1.19
11
- pytorch>=1.2
12
- ```
13
-
14
- 安装方法:
15
-
16
- ```shell
17
- pip install kevin-toolbox --no-dependencies
18
- ```
19
-
20
-
21
-
22
- [项目地址 Repo](https://github.com/cantbeblank96/kevin_toolbox)
23
-
24
- [使用指南 User_Guide](./notes/User_Guide.md)
25
-
26
- [免责声明 Disclaimer](./notes/Disclaimer.md)
27
-
28
- [版本更新记录](./notes/Release_Record.md):
29
-
30
- - v 1.1.2(2023-06-27)【bug fix】
31
-
32
- - computer_science.algorithm.for_nested_dict_list
33
- - 改进 get_value_by_name()
34
- - 新增了参数 b_pop 用于支持取值的同时将该值从 var 中移除
35
- - 新增了参数 default 用于设置取值失败时是报错还是返回默认值
36
- - computer_science.algorithm.registration
37
- - Registry
38
- - 【bug fix】修复了问题:当已有实例的 uid 为正整数 n,同时 cls.__counter 为 n 时,不指定 uid 再创建实例将错误地返回 uid=n 的已有实例而不是新建一个。
39
- - 将 self.pop() 函数的功能合并到 self.get(... ,b_pop=...) 中
40
- - computer_science.algorithm.scheduler
41
- - 改进 Trigger
42
- - 使用 Registry 来管理触发目标
43
- - 新增 self.unbind() 函数来解除绑定
44
- - 在 update_by_state() 中新增了 target_names 参数来决定调用哪些目标
45
- - 新增 Trigger 的状态管理相关函数
46
- - self.clear_state_dict(): 清除 Trigger 中保存的状态
47
- - self.load_state_dict(): 加载
48
- - self.state_dict(): 获取
49
- - load_state_dict 和 state_dict 的接口名称是为了和 pytorch 中模型、优化器的状态加载、获取保持一致。
50
-
51
-
52
-
@@ -1,69 +0,0 @@
1
- from kevin_toolbox.computer_science.algorithm.for_nested_dict_list.name_handler import escape_node
2
-
3
-
4
- def traverse(var, match_cond, action_mode="remove", converter=None,
5
- b_use_name_as_idx=False, b_traverse_matched_element=False):
6
- """
7
- 遍历 var 找到符合 match_cond 的元素,将其按照 action_mode 指定的操作进行处理
8
-
9
- 参数:
10
- var: 待处理数据
11
- 当 var 不是 dict 或者 list 时,将直接返回 var 而不做处理
12
- match_cond: <func> 元素的匹配条件
13
- 函数类型为 def(parent_type, idx, value): ...
14
- 其中:
15
- parent_type 该元素源自哪种结构体,有两个可能传入的值: list,dict
16
- idx 该元素在结构体中的位置
17
- 当 b_use_name_as_idx=False 时,
18
- 对于列表是 index,对于字典是 key
19
- 当为 True 时,传入的是元素在整体结构中的 name 位置,name的格式和含义参考
20
- name_handler.parse_name() 中的介绍
21
- value 元素的值
22
- action_mode: <str> 如何对匹配上的元素进行处理
23
- 目前支持:
24
- "remove" 将该元素移除
25
- "replace" 将该元素替换为 converter() 处理后的结果
26
- "skip": 不进行任何操作
27
- converter: <func> 参见 action_mode 中的 "replace" 模式
28
- 函数类型为 def(idx, value): ...
29
- 其中 idx 和 value 的含义参见参数 match_cond 介绍
30
- b_use_name_as_idx: <boolean> 对于 match_cond/converter 中的 idx 参数,是传入整体的 name 还是父节点的 index 或 key。
31
- 默认为 False
32
- b_traverse_matched_element <boolean> 对于匹配上的元素,经过处理后,是否继续遍历该元素的内容
33
- 默认为 False
34
- """
35
- assert callable(match_cond)
36
- assert action_mode in {"replace", "remove", "skip"}
37
- if action_mode == "replace":
38
- assert callable(converter)
39
-
40
- return recursive_(var, match_cond, action_mode, converter, b_use_name_as_idx, b_traverse_matched_element, "")
41
-
42
-
43
- def recursive_(var, match_cond, action_mode, converter, b_use_name_as_idx, b_traverse_matched_element, pre_name):
44
- if isinstance(var, (list, dict)):
45
- items = reversed(list(enumerate(var))) if isinstance(var, list) else list(var.items())
46
- for k, v in items:
47
- if b_use_name_as_idx:
48
- method = "@" if isinstance(var, list) else ":"
49
- idx = f'{pre_name}{method}{escape_node(node=k, b_reversed=False, times=1)}'
50
- else:
51
- idx = k
52
- # 匹配
53
- b_matched = match_cond(type(var), idx, v)
54
- # 处理
55
- if b_matched:
56
- if action_mode == "remove":
57
- var.pop(k)
58
- elif action_mode == "replace":
59
- var[k] = converter(idx, v)
60
- else:
61
- pass
62
- # 递归遍历
63
- if b_matched and not b_traverse_matched_element:
64
- continue
65
- var[k] = recursive_(var[k], match_cond, action_mode, converter, b_use_name_as_idx,
66
- b_traverse_matched_element, idx)
67
- else:
68
- pass
69
- return var