scitex 2.0.0__py2.py3-none-any.whl
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.
- scitex/__init__.py +73 -0
- scitex/__main__.py +89 -0
- scitex/__version__.py +14 -0
- scitex/_sh.py +59 -0
- scitex/ai/_LearningCurveLogger.py +583 -0
- scitex/ai/__Classifiers.py +101 -0
- scitex/ai/__init__.py +55 -0
- scitex/ai/_gen_ai/_Anthropic.py +173 -0
- scitex/ai/_gen_ai/_BaseGenAI.py +336 -0
- scitex/ai/_gen_ai/_DeepSeek.py +175 -0
- scitex/ai/_gen_ai/_Google.py +161 -0
- scitex/ai/_gen_ai/_Groq.py +97 -0
- scitex/ai/_gen_ai/_Llama.py +142 -0
- scitex/ai/_gen_ai/_OpenAI.py +230 -0
- scitex/ai/_gen_ai/_PARAMS.py +565 -0
- scitex/ai/_gen_ai/_Perplexity.py +191 -0
- scitex/ai/_gen_ai/__init__.py +32 -0
- scitex/ai/_gen_ai/_calc_cost.py +78 -0
- scitex/ai/_gen_ai/_format_output_func.py +183 -0
- scitex/ai/_gen_ai/_genai_factory.py +71 -0
- scitex/ai/act/__init__.py +8 -0
- scitex/ai/act/_define.py +11 -0
- scitex/ai/classification/__init__.py +7 -0
- scitex/ai/classification/classification_reporter.py +1137 -0
- scitex/ai/classification/classifier_server.py +131 -0
- scitex/ai/classification/classifiers.py +101 -0
- scitex/ai/classification_reporter.py +1161 -0
- scitex/ai/classifier_server.py +131 -0
- scitex/ai/clustering/__init__.py +11 -0
- scitex/ai/clustering/_pca.py +115 -0
- scitex/ai/clustering/_umap.py +376 -0
- scitex/ai/early_stopping.py +149 -0
- scitex/ai/feature_extraction/__init__.py +56 -0
- scitex/ai/feature_extraction/vit.py +148 -0
- scitex/ai/genai/__init__.py +277 -0
- scitex/ai/genai/anthropic.py +177 -0
- scitex/ai/genai/anthropic_provider.py +320 -0
- scitex/ai/genai/anthropic_refactored.py +109 -0
- scitex/ai/genai/auth_manager.py +200 -0
- scitex/ai/genai/base_genai.py +336 -0
- scitex/ai/genai/base_provider.py +291 -0
- scitex/ai/genai/calc_cost.py +78 -0
- scitex/ai/genai/chat_history.py +307 -0
- scitex/ai/genai/cost_tracker.py +276 -0
- scitex/ai/genai/deepseek.py +188 -0
- scitex/ai/genai/deepseek_provider.py +251 -0
- scitex/ai/genai/format_output_func.py +183 -0
- scitex/ai/genai/genai_factory.py +71 -0
- scitex/ai/genai/google.py +169 -0
- scitex/ai/genai/google_provider.py +228 -0
- scitex/ai/genai/groq.py +104 -0
- scitex/ai/genai/groq_provider.py +248 -0
- scitex/ai/genai/image_processor.py +250 -0
- scitex/ai/genai/llama.py +155 -0
- scitex/ai/genai/llama_provider.py +214 -0
- scitex/ai/genai/mock_provider.py +127 -0
- scitex/ai/genai/model_registry.py +304 -0
- scitex/ai/genai/openai.py +230 -0
- scitex/ai/genai/openai_provider.py +293 -0
- scitex/ai/genai/params.py +565 -0
- scitex/ai/genai/perplexity.py +202 -0
- scitex/ai/genai/perplexity_provider.py +205 -0
- scitex/ai/genai/provider_base.py +302 -0
- scitex/ai/genai/provider_factory.py +370 -0
- scitex/ai/genai/response_handler.py +235 -0
- scitex/ai/layer/_Pass.py +21 -0
- scitex/ai/layer/__init__.py +10 -0
- scitex/ai/layer/_switch.py +8 -0
- scitex/ai/loss/_L1L2Losses.py +34 -0
- scitex/ai/loss/__init__.py +12 -0
- scitex/ai/loss/multi_task_loss.py +47 -0
- scitex/ai/metrics/__init__.py +9 -0
- scitex/ai/metrics/_bACC.py +51 -0
- scitex/ai/metrics/silhoute_score_block.py +496 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/__init__.py +0 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/__init__.py +3 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger.py +207 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger2020.py +238 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger913A.py +215 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/rangerqh.py +184 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/setup.py +24 -0
- scitex/ai/optim/__init__.py +13 -0
- scitex/ai/optim/_get_set.py +31 -0
- scitex/ai/optim/_optimizers.py +71 -0
- scitex/ai/plt/__init__.py +21 -0
- scitex/ai/plt/_conf_mat.py +592 -0
- scitex/ai/plt/_learning_curve.py +194 -0
- scitex/ai/plt/_optuna_study.py +111 -0
- scitex/ai/plt/aucs/__init__.py +2 -0
- scitex/ai/plt/aucs/example.py +60 -0
- scitex/ai/plt/aucs/pre_rec_auc.py +223 -0
- scitex/ai/plt/aucs/roc_auc.py +246 -0
- scitex/ai/sampling/undersample.py +29 -0
- scitex/ai/sk/__init__.py +11 -0
- scitex/ai/sk/_clf.py +58 -0
- scitex/ai/sk/_to_sktime.py +100 -0
- scitex/ai/sklearn/__init__.py +26 -0
- scitex/ai/sklearn/clf.py +58 -0
- scitex/ai/sklearn/to_sktime.py +100 -0
- scitex/ai/training/__init__.py +7 -0
- scitex/ai/training/early_stopping.py +150 -0
- scitex/ai/training/learning_curve_logger.py +555 -0
- scitex/ai/utils/__init__.py +22 -0
- scitex/ai/utils/_check_params.py +50 -0
- scitex/ai/utils/_default_dataset.py +46 -0
- scitex/ai/utils/_format_samples_for_sktime.py +26 -0
- scitex/ai/utils/_label_encoder.py +134 -0
- scitex/ai/utils/_merge_labels.py +22 -0
- scitex/ai/utils/_sliding_window_data_augmentation.py +11 -0
- scitex/ai/utils/_under_sample.py +51 -0
- scitex/ai/utils/_verify_n_gpus.py +16 -0
- scitex/ai/utils/grid_search.py +148 -0
- scitex/context/__init__.py +9 -0
- scitex/context/_suppress_output.py +38 -0
- scitex/db/_BaseMixins/_BaseBackupMixin.py +30 -0
- scitex/db/_BaseMixins/_BaseBatchMixin.py +31 -0
- scitex/db/_BaseMixins/_BaseBlobMixin.py +81 -0
- scitex/db/_BaseMixins/_BaseConnectionMixin.py +43 -0
- scitex/db/_BaseMixins/_BaseImportExportMixin.py +39 -0
- scitex/db/_BaseMixins/_BaseIndexMixin.py +29 -0
- scitex/db/_BaseMixins/_BaseMaintenanceMixin.py +33 -0
- scitex/db/_BaseMixins/_BaseQueryMixin.py +52 -0
- scitex/db/_BaseMixins/_BaseRowMixin.py +32 -0
- scitex/db/_BaseMixins/_BaseSchemaMixin.py +44 -0
- scitex/db/_BaseMixins/_BaseTableMixin.py +66 -0
- scitex/db/_BaseMixins/_BaseTransactionMixin.py +52 -0
- scitex/db/_BaseMixins/__init__.py +30 -0
- scitex/db/_PostgreSQL.py +126 -0
- scitex/db/_PostgreSQLMixins/_BackupMixin.py +166 -0
- scitex/db/_PostgreSQLMixins/_BatchMixin.py +82 -0
- scitex/db/_PostgreSQLMixins/_BlobMixin.py +231 -0
- scitex/db/_PostgreSQLMixins/_ConnectionMixin.py +92 -0
- scitex/db/_PostgreSQLMixins/_ImportExportMixin.py +59 -0
- scitex/db/_PostgreSQLMixins/_IndexMixin.py +64 -0
- scitex/db/_PostgreSQLMixins/_MaintenanceMixin.py +175 -0
- scitex/db/_PostgreSQLMixins/_QueryMixin.py +108 -0
- scitex/db/_PostgreSQLMixins/_RowMixin.py +75 -0
- scitex/db/_PostgreSQLMixins/_SchemaMixin.py +126 -0
- scitex/db/_PostgreSQLMixins/_TableMixin.py +176 -0
- scitex/db/_PostgreSQLMixins/_TransactionMixin.py +57 -0
- scitex/db/_PostgreSQLMixins/__init__.py +34 -0
- scitex/db/_SQLite3.py +2136 -0
- scitex/db/_SQLite3Mixins/_BatchMixin.py +243 -0
- scitex/db/_SQLite3Mixins/_BlobMixin.py +229 -0
- scitex/db/_SQLite3Mixins/_ConnectionMixin.py +108 -0
- scitex/db/_SQLite3Mixins/_ImportExportMixin.py +80 -0
- scitex/db/_SQLite3Mixins/_IndexMixin.py +32 -0
- scitex/db/_SQLite3Mixins/_MaintenanceMixin.py +176 -0
- scitex/db/_SQLite3Mixins/_QueryMixin.py +83 -0
- scitex/db/_SQLite3Mixins/_RowMixin.py +75 -0
- scitex/db/_SQLite3Mixins/_TableMixin.py +183 -0
- scitex/db/_SQLite3Mixins/_TransactionMixin.py +71 -0
- scitex/db/_SQLite3Mixins/__init__.py +30 -0
- scitex/db/__init__.py +14 -0
- scitex/db/_delete_duplicates.py +397 -0
- scitex/db/_inspect.py +163 -0
- scitex/decorators/__init__.py +54 -0
- scitex/decorators/_auto_order.py +172 -0
- scitex/decorators/_batch_fn.py +127 -0
- scitex/decorators/_cache_disk.py +32 -0
- scitex/decorators/_cache_mem.py +12 -0
- scitex/decorators/_combined.py +98 -0
- scitex/decorators/_converters.py +282 -0
- scitex/decorators/_deprecated.py +26 -0
- scitex/decorators/_not_implemented.py +30 -0
- scitex/decorators/_numpy_fn.py +86 -0
- scitex/decorators/_pandas_fn.py +121 -0
- scitex/decorators/_preserve_doc.py +19 -0
- scitex/decorators/_signal_fn.py +95 -0
- scitex/decorators/_timeout.py +55 -0
- scitex/decorators/_torch_fn.py +136 -0
- scitex/decorators/_wrap.py +39 -0
- scitex/decorators/_xarray_fn.py +88 -0
- scitex/dev/__init__.py +15 -0
- scitex/dev/_analyze_code_flow.py +284 -0
- scitex/dev/_reload.py +59 -0
- scitex/dict/_DotDict.py +442 -0
- scitex/dict/__init__.py +18 -0
- scitex/dict/_listed_dict.py +42 -0
- scitex/dict/_pop_keys.py +36 -0
- scitex/dict/_replace.py +13 -0
- scitex/dict/_safe_merge.py +62 -0
- scitex/dict/_to_str.py +32 -0
- scitex/dsp/__init__.py +72 -0
- scitex/dsp/_crop.py +122 -0
- scitex/dsp/_demo_sig.py +331 -0
- scitex/dsp/_detect_ripples.py +212 -0
- scitex/dsp/_ensure_3d.py +18 -0
- scitex/dsp/_hilbert.py +78 -0
- scitex/dsp/_listen.py +702 -0
- scitex/dsp/_misc.py +30 -0
- scitex/dsp/_mne.py +32 -0
- scitex/dsp/_modulation_index.py +79 -0
- scitex/dsp/_pac.py +319 -0
- scitex/dsp/_psd.py +102 -0
- scitex/dsp/_resample.py +65 -0
- scitex/dsp/_time.py +36 -0
- scitex/dsp/_transform.py +68 -0
- scitex/dsp/_wavelet.py +212 -0
- scitex/dsp/add_noise.py +111 -0
- scitex/dsp/example.py +253 -0
- scitex/dsp/filt.py +155 -0
- scitex/dsp/norm.py +18 -0
- scitex/dsp/params.py +51 -0
- scitex/dsp/reference.py +43 -0
- scitex/dsp/template.py +25 -0
- scitex/dsp/utils/__init__.py +15 -0
- scitex/dsp/utils/_differential_bandpass_filters.py +120 -0
- scitex/dsp/utils/_ensure_3d.py +18 -0
- scitex/dsp/utils/_ensure_even_len.py +10 -0
- scitex/dsp/utils/_zero_pad.py +48 -0
- scitex/dsp/utils/filter.py +408 -0
- scitex/dsp/utils/pac.py +177 -0
- scitex/dt/__init__.py +8 -0
- scitex/dt/_linspace.py +130 -0
- scitex/etc/__init__.py +15 -0
- scitex/etc/wait_key.py +34 -0
- scitex/gen/_DimHandler.py +196 -0
- scitex/gen/_TimeStamper.py +244 -0
- scitex/gen/__init__.py +95 -0
- scitex/gen/_alternate_kwarg.py +13 -0
- scitex/gen/_cache.py +11 -0
- scitex/gen/_check_host.py +34 -0
- scitex/gen/_ci.py +12 -0
- scitex/gen/_close.py +222 -0
- scitex/gen/_embed.py +78 -0
- scitex/gen/_inspect_module.py +257 -0
- scitex/gen/_is_ipython.py +12 -0
- scitex/gen/_less.py +48 -0
- scitex/gen/_list_packages.py +139 -0
- scitex/gen/_mat2py.py +88 -0
- scitex/gen/_norm.py +170 -0
- scitex/gen/_paste.py +18 -0
- scitex/gen/_print_config.py +84 -0
- scitex/gen/_shell.py +48 -0
- scitex/gen/_src.py +111 -0
- scitex/gen/_start.py +451 -0
- scitex/gen/_symlink.py +55 -0
- scitex/gen/_symlog.py +27 -0
- scitex/gen/_tee.py +238 -0
- scitex/gen/_title2path.py +60 -0
- scitex/gen/_title_case.py +88 -0
- scitex/gen/_to_even.py +84 -0
- scitex/gen/_to_odd.py +34 -0
- scitex/gen/_to_rank.py +39 -0
- scitex/gen/_transpose.py +37 -0
- scitex/gen/_type.py +78 -0
- scitex/gen/_var_info.py +73 -0
- scitex/gen/_wrap.py +17 -0
- scitex/gen/_xml2dict.py +76 -0
- scitex/gen/misc.py +730 -0
- scitex/gen/path.py +0 -0
- scitex/general/__init__.py +5 -0
- scitex/gists/_SigMacro_processFigure_S.py +128 -0
- scitex/gists/_SigMacro_toBlue.py +172 -0
- scitex/gists/__init__.py +12 -0
- scitex/io/_H5Explorer.py +292 -0
- scitex/io/__init__.py +82 -0
- scitex/io/_cache.py +101 -0
- scitex/io/_flush.py +24 -0
- scitex/io/_glob.py +103 -0
- scitex/io/_json2md.py +113 -0
- scitex/io/_load.py +168 -0
- scitex/io/_load_configs.py +146 -0
- scitex/io/_load_modules/__init__.py +38 -0
- scitex/io/_load_modules/_catboost.py +66 -0
- scitex/io/_load_modules/_con.py +20 -0
- scitex/io/_load_modules/_db.py +24 -0
- scitex/io/_load_modules/_docx.py +42 -0
- scitex/io/_load_modules/_eeg.py +110 -0
- scitex/io/_load_modules/_hdf5.py +196 -0
- scitex/io/_load_modules/_image.py +19 -0
- scitex/io/_load_modules/_joblib.py +19 -0
- scitex/io/_load_modules/_json.py +18 -0
- scitex/io/_load_modules/_markdown.py +103 -0
- scitex/io/_load_modules/_matlab.py +37 -0
- scitex/io/_load_modules/_numpy.py +39 -0
- scitex/io/_load_modules/_optuna.py +155 -0
- scitex/io/_load_modules/_pandas.py +69 -0
- scitex/io/_load_modules/_pdf.py +31 -0
- scitex/io/_load_modules/_pickle.py +24 -0
- scitex/io/_load_modules/_torch.py +16 -0
- scitex/io/_load_modules/_txt.py +126 -0
- scitex/io/_load_modules/_xml.py +49 -0
- scitex/io/_load_modules/_yaml.py +23 -0
- scitex/io/_mv_to_tmp.py +19 -0
- scitex/io/_path.py +286 -0
- scitex/io/_reload.py +78 -0
- scitex/io/_save.py +539 -0
- scitex/io/_save_modules/__init__.py +66 -0
- scitex/io/_save_modules/_catboost.py +22 -0
- scitex/io/_save_modules/_csv.py +89 -0
- scitex/io/_save_modules/_excel.py +49 -0
- scitex/io/_save_modules/_hdf5.py +249 -0
- scitex/io/_save_modules/_html.py +48 -0
- scitex/io/_save_modules/_image.py +140 -0
- scitex/io/_save_modules/_joblib.py +25 -0
- scitex/io/_save_modules/_json.py +25 -0
- scitex/io/_save_modules/_listed_dfs_as_csv.py +57 -0
- scitex/io/_save_modules/_listed_scalars_as_csv.py +42 -0
- scitex/io/_save_modules/_matlab.py +24 -0
- scitex/io/_save_modules/_mp4.py +29 -0
- scitex/io/_save_modules/_numpy.py +57 -0
- scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +38 -0
- scitex/io/_save_modules/_pickle.py +45 -0
- scitex/io/_save_modules/_plotly.py +27 -0
- scitex/io/_save_modules/_text.py +23 -0
- scitex/io/_save_modules/_torch.py +26 -0
- scitex/io/_save_modules/_yaml.py +29 -0
- scitex/life/__init__.py +10 -0
- scitex/life/_monitor_rain.py +49 -0
- scitex/linalg/__init__.py +17 -0
- scitex/linalg/_distance.py +63 -0
- scitex/linalg/_geometric_median.py +64 -0
- scitex/linalg/_misc.py +73 -0
- scitex/nn/_AxiswiseDropout.py +27 -0
- scitex/nn/_BNet.py +126 -0
- scitex/nn/_BNet_Res.py +164 -0
- scitex/nn/_ChannelGainChanger.py +44 -0
- scitex/nn/_DropoutChannels.py +50 -0
- scitex/nn/_Filters.py +489 -0
- scitex/nn/_FreqGainChanger.py +110 -0
- scitex/nn/_GaussianFilter.py +48 -0
- scitex/nn/_Hilbert.py +111 -0
- scitex/nn/_MNet_1000.py +157 -0
- scitex/nn/_ModulationIndex.py +221 -0
- scitex/nn/_PAC.py +414 -0
- scitex/nn/_PSD.py +40 -0
- scitex/nn/_ResNet1D.py +120 -0
- scitex/nn/_SpatialAttention.py +25 -0
- scitex/nn/_Spectrogram.py +161 -0
- scitex/nn/_SwapChannels.py +50 -0
- scitex/nn/_TransposeLayer.py +19 -0
- scitex/nn/_Wavelet.py +183 -0
- scitex/nn/__init__.py +63 -0
- scitex/os/__init__.py +8 -0
- scitex/os/_mv.py +50 -0
- scitex/parallel/__init__.py +8 -0
- scitex/parallel/_run.py +151 -0
- scitex/path/__init__.py +33 -0
- scitex/path/_clean.py +52 -0
- scitex/path/_find.py +108 -0
- scitex/path/_get_module_path.py +51 -0
- scitex/path/_get_spath.py +35 -0
- scitex/path/_getsize.py +18 -0
- scitex/path/_increment_version.py +87 -0
- scitex/path/_mk_spath.py +51 -0
- scitex/path/_path.py +19 -0
- scitex/path/_split.py +23 -0
- scitex/path/_this_path.py +19 -0
- scitex/path/_version.py +101 -0
- scitex/pd/__init__.py +41 -0
- scitex/pd/_find_indi.py +126 -0
- scitex/pd/_find_pval.py +113 -0
- scitex/pd/_force_df.py +154 -0
- scitex/pd/_from_xyz.py +71 -0
- scitex/pd/_ignore_SettingWithCopyWarning.py +34 -0
- scitex/pd/_melt_cols.py +81 -0
- scitex/pd/_merge_columns.py +221 -0
- scitex/pd/_mv.py +63 -0
- scitex/pd/_replace.py +62 -0
- scitex/pd/_round.py +93 -0
- scitex/pd/_slice.py +63 -0
- scitex/pd/_sort.py +91 -0
- scitex/pd/_to_numeric.py +53 -0
- scitex/pd/_to_xy.py +59 -0
- scitex/pd/_to_xyz.py +110 -0
- scitex/plt/__init__.py +36 -0
- scitex/plt/_subplots/_AxesWrapper.py +182 -0
- scitex/plt/_subplots/_AxisWrapper.py +249 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +414 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +896 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +368 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_TrackingMixin.py +185 -0
- scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +16 -0
- scitex/plt/_subplots/_FigWrapper.py +226 -0
- scitex/plt/_subplots/_SubplotsWrapper.py +171 -0
- scitex/plt/_subplots/__init__.py +111 -0
- scitex/plt/_subplots/_export_as_csv.py +232 -0
- scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +61 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_bar.py +90 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_barh.py +49 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_boxplot.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_contour.py +39 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_errorbar.py +125 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +72 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill.py +34 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill_between.py +36 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_hist.py +79 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py +59 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +32 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +79 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_conf_mat.py +64 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_ecdf.py +44 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_fillv.py +70 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_heatmap.py +66 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_image.py +95 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_joyplot.py +67 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +52 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_line.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_ci.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_std.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_median_iqr.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_raster.py +44 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_rectangle.py +103 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter_hist.py +82 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_shaded_line.py +58 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_violin.py +117 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_scatter.py +30 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_barplot.py +51 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_boxplot.py +93 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_heatmap.py +94 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_histplot.py +92 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +65 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py +59 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +58 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +45 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py +70 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py +155 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py +64 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py +77 -0
- scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +210 -0
- scitex/plt/_subplots/_export_as_csv_formatters/verify_formatters.py +342 -0
- scitex/plt/_subplots/_export_as_csv_formatters.py +115 -0
- scitex/plt/_tpl.py +28 -0
- scitex/plt/ax/__init__.py +114 -0
- scitex/plt/ax/_plot/__init__.py +53 -0
- scitex/plt/ax/_plot/_plot_circular_hist.py +124 -0
- scitex/plt/ax/_plot/_plot_conf_mat.py +136 -0
- scitex/plt/ax/_plot/_plot_cube.py +57 -0
- scitex/plt/ax/_plot/_plot_ecdf.py +84 -0
- scitex/plt/ax/_plot/_plot_fillv.py +55 -0
- scitex/plt/ax/_plot/_plot_heatmap.py +266 -0
- scitex/plt/ax/_plot/_plot_image.py +94 -0
- scitex/plt/ax/_plot/_plot_joyplot.py +76 -0
- scitex/plt/ax/_plot/_plot_raster.py +172 -0
- scitex/plt/ax/_plot/_plot_rectangle.py +69 -0
- scitex/plt/ax/_plot/_plot_scatter_hist.py +133 -0
- scitex/plt/ax/_plot/_plot_shaded_line.py +142 -0
- scitex/plt/ax/_plot/_plot_statistical_shaded_line.py +221 -0
- scitex/plt/ax/_plot/_plot_violin.py +343 -0
- scitex/plt/ax/_style/__init__.py +38 -0
- scitex/plt/ax/_style/_add_marginal_ax.py +44 -0
- scitex/plt/ax/_style/_add_panel.py +92 -0
- scitex/plt/ax/_style/_extend.py +64 -0
- scitex/plt/ax/_style/_force_aspect.py +37 -0
- scitex/plt/ax/_style/_format_label.py +23 -0
- scitex/plt/ax/_style/_hide_spines.py +84 -0
- scitex/plt/ax/_style/_map_ticks.py +182 -0
- scitex/plt/ax/_style/_rotate_labels.py +215 -0
- scitex/plt/ax/_style/_sci_note.py +279 -0
- scitex/plt/ax/_style/_set_log_scale.py +299 -0
- scitex/plt/ax/_style/_set_meta.py +261 -0
- scitex/plt/ax/_style/_set_n_ticks.py +37 -0
- scitex/plt/ax/_style/_set_size.py +16 -0
- scitex/plt/ax/_style/_set_supxyt.py +116 -0
- scitex/plt/ax/_style/_set_ticks.py +276 -0
- scitex/plt/ax/_style/_set_xyt.py +121 -0
- scitex/plt/ax/_style/_share_axes.py +264 -0
- scitex/plt/ax/_style/_shift.py +139 -0
- scitex/plt/ax/_style/_show_spines.py +333 -0
- scitex/plt/color/_PARAMS.py +70 -0
- scitex/plt/color/__init__.py +52 -0
- scitex/plt/color/_add_hue_col.py +41 -0
- scitex/plt/color/_colors.py +205 -0
- scitex/plt/color/_get_colors_from_cmap.py +134 -0
- scitex/plt/color/_interpolate.py +29 -0
- scitex/plt/color/_vizualize_colors.py +54 -0
- scitex/plt/utils/__init__.py +44 -0
- scitex/plt/utils/_calc_bacc_from_conf_mat.py +46 -0
- scitex/plt/utils/_calc_nice_ticks.py +101 -0
- scitex/plt/utils/_close.py +68 -0
- scitex/plt/utils/_colorbar.py +96 -0
- scitex/plt/utils/_configure_mpl.py +295 -0
- scitex/plt/utils/_histogram_utils.py +132 -0
- scitex/plt/utils/_im2grid.py +70 -0
- scitex/plt/utils/_is_valid_axis.py +78 -0
- scitex/plt/utils/_mk_colorbar.py +65 -0
- scitex/plt/utils/_mk_patches.py +26 -0
- scitex/plt/utils/_scientific_captions.py +638 -0
- scitex/plt/utils/_scitex_config.py +223 -0
- scitex/reproduce/__init__.py +14 -0
- scitex/reproduce/_fix_seeds.py +45 -0
- scitex/reproduce/_gen_ID.py +55 -0
- scitex/reproduce/_gen_timestamp.py +35 -0
- scitex/res/__init__.py +5 -0
- scitex/resource/__init__.py +13 -0
- scitex/resource/_get_processor_usages.py +281 -0
- scitex/resource/_get_specs.py +280 -0
- scitex/resource/_log_processor_usages.py +190 -0
- scitex/resource/_utils/__init__.py +31 -0
- scitex/resource/_utils/_get_env_info.py +481 -0
- scitex/resource/limit_ram.py +33 -0
- scitex/scholar/__init__.py +24 -0
- scitex/scholar/_local_search.py +454 -0
- scitex/scholar/_paper.py +244 -0
- scitex/scholar/_pdf_downloader.py +325 -0
- scitex/scholar/_search.py +393 -0
- scitex/scholar/_vector_search.py +370 -0
- scitex/scholar/_web_sources.py +457 -0
- scitex/stats/__init__.py +31 -0
- scitex/stats/_calc_partial_corr.py +17 -0
- scitex/stats/_corr_test_multi.py +94 -0
- scitex/stats/_corr_test_wrapper.py +115 -0
- scitex/stats/_describe_wrapper.py +90 -0
- scitex/stats/_multiple_corrections.py +63 -0
- scitex/stats/_nan_stats.py +93 -0
- scitex/stats/_p2stars.py +116 -0
- scitex/stats/_p2stars_wrapper.py +56 -0
- scitex/stats/_statistical_tests.py +73 -0
- scitex/stats/desc/__init__.py +40 -0
- scitex/stats/desc/_describe.py +189 -0
- scitex/stats/desc/_nan.py +289 -0
- scitex/stats/desc/_real.py +94 -0
- scitex/stats/multiple/__init__.py +14 -0
- scitex/stats/multiple/_bonferroni_correction.py +72 -0
- scitex/stats/multiple/_fdr_correction.py +400 -0
- scitex/stats/multiple/_multicompair.py +28 -0
- scitex/stats/tests/__corr_test.py +277 -0
- scitex/stats/tests/__corr_test_multi.py +343 -0
- scitex/stats/tests/__corr_test_single.py +277 -0
- scitex/stats/tests/__init__.py +22 -0
- scitex/stats/tests/_brunner_munzel_test.py +192 -0
- scitex/stats/tests/_nocorrelation_test.py +28 -0
- scitex/stats/tests/_smirnov_grubbs.py +98 -0
- scitex/str/__init__.py +113 -0
- scitex/str/_clean_path.py +75 -0
- scitex/str/_color_text.py +52 -0
- scitex/str/_decapitalize.py +58 -0
- scitex/str/_factor_out_digits.py +281 -0
- scitex/str/_format_plot_text.py +498 -0
- scitex/str/_grep.py +48 -0
- scitex/str/_latex.py +155 -0
- scitex/str/_latex_fallback.py +471 -0
- scitex/str/_mask_api.py +39 -0
- scitex/str/_mask_api_key.py +8 -0
- scitex/str/_parse.py +158 -0
- scitex/str/_print_block.py +47 -0
- scitex/str/_print_debug.py +68 -0
- scitex/str/_printc.py +62 -0
- scitex/str/_readable_bytes.py +38 -0
- scitex/str/_remove_ansi.py +23 -0
- scitex/str/_replace.py +134 -0
- scitex/str/_search.py +125 -0
- scitex/str/_squeeze_space.py +36 -0
- scitex/tex/__init__.py +10 -0
- scitex/tex/_preview.py +103 -0
- scitex/tex/_to_vec.py +116 -0
- scitex/torch/__init__.py +18 -0
- scitex/torch/_apply_to.py +34 -0
- scitex/torch/_nan_funcs.py +77 -0
- scitex/types/_ArrayLike.py +44 -0
- scitex/types/_ColorLike.py +21 -0
- scitex/types/__init__.py +14 -0
- scitex/types/_is_listed_X.py +70 -0
- scitex/utils/__init__.py +22 -0
- scitex/utils/_compress_hdf5.py +116 -0
- scitex/utils/_email.py +120 -0
- scitex/utils/_grid.py +148 -0
- scitex/utils/_notify.py +247 -0
- scitex/utils/_search.py +121 -0
- scitex/web/__init__.py +38 -0
- scitex/web/_search_pubmed.py +438 -0
- scitex/web/_summarize_url.py +158 -0
- scitex-2.0.0.dist-info/METADATA +307 -0
- scitex-2.0.0.dist-info/RECORD +572 -0
- scitex-2.0.0.dist-info/WHEEL +6 -0
- scitex-2.0.0.dist-info/licenses/LICENSE +7 -0
- scitex-2.0.0.dist-info/top_level.txt +1 -0
scitex/io/_path.py
ADDED
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-11-05 23:18:40 (ywatanabe)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/io/_path.py
|
|
5
|
+
|
|
6
|
+
import fnmatch
|
|
7
|
+
import os
|
|
8
|
+
import re
|
|
9
|
+
from glob import glob as _glob
|
|
10
|
+
|
|
11
|
+
from ..path._split import split
|
|
12
|
+
from ..path._this_path import this_path
|
|
13
|
+
|
|
14
|
+
################################################################################
|
|
15
|
+
## PATH
|
|
16
|
+
################################################################################
|
|
17
|
+
# def get_this_fpath(when_ipython="/tmp/fake.py"):
|
|
18
|
+
# """
|
|
19
|
+
# Get the file path of the calling script, with special handling for IPython environments.
|
|
20
|
+
|
|
21
|
+
# Parameters:
|
|
22
|
+
# -----------
|
|
23
|
+
# when_ipython : str, optional
|
|
24
|
+
# The file path to return when running in an IPython environment. Default is "/tmp/fake.py".
|
|
25
|
+
|
|
26
|
+
# Returns:
|
|
27
|
+
# --------
|
|
28
|
+
# str
|
|
29
|
+
# The file path of the calling script or the specified path for IPython environments.
|
|
30
|
+
|
|
31
|
+
# Example:
|
|
32
|
+
# --------
|
|
33
|
+
# >>> import scitex.io._path as path
|
|
34
|
+
# >>> fpath = path.get_this_fpath()
|
|
35
|
+
# >>> print(fpath)
|
|
36
|
+
# '/path/to/current/script.py'
|
|
37
|
+
# """
|
|
38
|
+
# THIS_FILE = inspect.stack()[1].filename
|
|
39
|
+
# if "ipython" in __file__: # for ipython
|
|
40
|
+
# THIS_FILE = when_ipython # "/tmp/fake.py"
|
|
41
|
+
# return __file__
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# def mk_spath(sfname, makedirs=False):
|
|
45
|
+
# """
|
|
46
|
+
# Create a save path based on the calling script's location.
|
|
47
|
+
|
|
48
|
+
# Parameters:
|
|
49
|
+
# -----------
|
|
50
|
+
# sfname : str
|
|
51
|
+
# The name of the file to be saved.
|
|
52
|
+
# makedirs : bool, optional
|
|
53
|
+
# If True, create the directory structure for the save path. Default is False.
|
|
54
|
+
|
|
55
|
+
# Returns:
|
|
56
|
+
# --------
|
|
57
|
+
# str
|
|
58
|
+
# The full save path for the file.
|
|
59
|
+
|
|
60
|
+
# Example:
|
|
61
|
+
# --------
|
|
62
|
+
# >>> import scitex.io._path as path
|
|
63
|
+
# >>> spath = path.mk_spath('output.txt', makedirs=True)
|
|
64
|
+
# >>> print(spath)
|
|
65
|
+
# '/path/to/current/script/output.txt'
|
|
66
|
+
# """
|
|
67
|
+
# THIS_FILE = inspect.stack()[1].filename
|
|
68
|
+
# if "ipython" in __file__: # for ipython
|
|
69
|
+
# THIS_FILE = f'/tmp/fake-{os.getenv("USER")}.py'
|
|
70
|
+
|
|
71
|
+
# ## spath
|
|
72
|
+
# fpath = __file__
|
|
73
|
+
# fdir, fname, _ = split_fpath(fpath)
|
|
74
|
+
# sdir = fdir + fname + "/"
|
|
75
|
+
# spath = sdir + sfname
|
|
76
|
+
|
|
77
|
+
# if makedirs:
|
|
78
|
+
# os.makedirs(split(spath)[0], exist_ok=True)
|
|
79
|
+
|
|
80
|
+
# return spath
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def find_the_git_root_dir():
|
|
84
|
+
"""
|
|
85
|
+
Find the root directory of the current Git repository.
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
--------
|
|
89
|
+
str
|
|
90
|
+
The path to the root directory of the current Git repository.
|
|
91
|
+
|
|
92
|
+
Raises:
|
|
93
|
+
-------
|
|
94
|
+
git.exc.InvalidGitRepositoryError
|
|
95
|
+
If the current directory is not part of a Git repository.
|
|
96
|
+
|
|
97
|
+
Example:
|
|
98
|
+
--------
|
|
99
|
+
>>> import scitex.io._path as path
|
|
100
|
+
>>> git_root = path.find_the_git_root_dir()
|
|
101
|
+
>>> print(git_root)
|
|
102
|
+
'/path/to/git/repository'
|
|
103
|
+
"""
|
|
104
|
+
import git
|
|
105
|
+
|
|
106
|
+
repo = git.Repo(".", search_parent_directories=True)
|
|
107
|
+
return repo.working_tree_dir
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def split_fpath(fpath):
|
|
111
|
+
"""
|
|
112
|
+
Split a file path into directory path, file name, and file extension.
|
|
113
|
+
|
|
114
|
+
Parameters:
|
|
115
|
+
-----------
|
|
116
|
+
fpath : str
|
|
117
|
+
The full file path to split.
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
--------
|
|
121
|
+
tuple
|
|
122
|
+
A tuple containing (dirname, fname, ext), where:
|
|
123
|
+
- dirname: str, the directory path
|
|
124
|
+
- fname: str, the file name without extension
|
|
125
|
+
- ext: str, the file extension
|
|
126
|
+
|
|
127
|
+
Example:
|
|
128
|
+
--------
|
|
129
|
+
>>> dirname, fname, ext = split_fpath('../data/01/day1/split_octave/2kHz_mat/tt8-2.mat')
|
|
130
|
+
>>> print(dirname)
|
|
131
|
+
'../data/01/day1/split_octave/2kHz_mat/'
|
|
132
|
+
>>> print(fname)
|
|
133
|
+
'tt8-2'
|
|
134
|
+
>>> print(ext)
|
|
135
|
+
'.mat'
|
|
136
|
+
"""
|
|
137
|
+
dirname = os.path.dirname(fpath) + "/"
|
|
138
|
+
base = os.path.basename(fpath)
|
|
139
|
+
fname, ext = os.path.splitext(base)
|
|
140
|
+
return dirname, fname, ext
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def touch(fpath):
|
|
144
|
+
"""
|
|
145
|
+
Create a file or update its modification time.
|
|
146
|
+
|
|
147
|
+
This function mimics the Unix 'touch' command.
|
|
148
|
+
|
|
149
|
+
Parameters:
|
|
150
|
+
-----------
|
|
151
|
+
fpath : str
|
|
152
|
+
The path to the file to be touched.
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
--------
|
|
156
|
+
None
|
|
157
|
+
|
|
158
|
+
Side Effects:
|
|
159
|
+
-------------
|
|
160
|
+
Creates a new file if it doesn't exist, or updates the modification time
|
|
161
|
+
of an existing file.
|
|
162
|
+
|
|
163
|
+
Example:
|
|
164
|
+
--------
|
|
165
|
+
>>> import scitex.io._path as path
|
|
166
|
+
>>> import os
|
|
167
|
+
>>> test_file = '/tmp/test_file.txt'
|
|
168
|
+
>>> path.touch(test_file)
|
|
169
|
+
>>> assert os.path.exists(test_file)
|
|
170
|
+
>>> print(f"File created: {test_file}")
|
|
171
|
+
File created: /tmp/test_file.txt
|
|
172
|
+
"""
|
|
173
|
+
import pathlib
|
|
174
|
+
|
|
175
|
+
return pathlib.Path(fpath).touch()
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def find(rootdir, type="f", exp=["*"]):
|
|
179
|
+
"""
|
|
180
|
+
Mimic the Unix find command to search for files or directories.
|
|
181
|
+
|
|
182
|
+
Parameters:
|
|
183
|
+
-----------
|
|
184
|
+
rootdir : str
|
|
185
|
+
The root directory to start the search from.
|
|
186
|
+
type : str, optional
|
|
187
|
+
The type of entries to search for. 'f' for files, 'd' for directories,
|
|
188
|
+
or None for both. Default is 'f'.
|
|
189
|
+
exp : str or list of str, optional
|
|
190
|
+
Pattern(s) to match against file or directory names. Default is ["*"].
|
|
191
|
+
|
|
192
|
+
Returns:
|
|
193
|
+
--------
|
|
194
|
+
list
|
|
195
|
+
A list of paths that match the search criteria.
|
|
196
|
+
|
|
197
|
+
Example:
|
|
198
|
+
--------
|
|
199
|
+
>>> find('/path/to/search', "f", "*.txt")
|
|
200
|
+
['/path/to/search/file1.txt', '/path/to/search/subdir/file2.txt']
|
|
201
|
+
"""
|
|
202
|
+
if isinstance(exp, str):
|
|
203
|
+
exp = [exp]
|
|
204
|
+
|
|
205
|
+
matches = []
|
|
206
|
+
for _exp in exp:
|
|
207
|
+
for root, dirs, files in os.walk(rootdir):
|
|
208
|
+
# Depending on the type, choose the list to iterate over
|
|
209
|
+
if type == "f": # Files only
|
|
210
|
+
names = files
|
|
211
|
+
elif type == "d": # Directories only
|
|
212
|
+
names = dirs
|
|
213
|
+
else: # All entries
|
|
214
|
+
names = files + dirs
|
|
215
|
+
|
|
216
|
+
for name in names:
|
|
217
|
+
# Construct the full path
|
|
218
|
+
path = os.path.join(root, name)
|
|
219
|
+
|
|
220
|
+
# If an _exp is provided, use fnmatch to filter names
|
|
221
|
+
if _exp and not fnmatch.fnmatch(name, _exp):
|
|
222
|
+
continue
|
|
223
|
+
|
|
224
|
+
# If type is set, ensure the type matches
|
|
225
|
+
if type == "f" and not os.path.isfile(path):
|
|
226
|
+
continue
|
|
227
|
+
if type == "d" and not os.path.isdir(path):
|
|
228
|
+
continue
|
|
229
|
+
|
|
230
|
+
# Add the matching path to the results
|
|
231
|
+
matches.append(path)
|
|
232
|
+
|
|
233
|
+
return matches
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def find_latest(dirname, fname, ext, version_prefix="_v"):
|
|
237
|
+
"""
|
|
238
|
+
Find the latest version of a file with a specific naming pattern.
|
|
239
|
+
|
|
240
|
+
This function searches for files in the given directory that match the pattern:
|
|
241
|
+
{fname}{version_prefix}{number}{ext} and returns the path of the file with the highest version number.
|
|
242
|
+
|
|
243
|
+
Parameters:
|
|
244
|
+
-----------
|
|
245
|
+
dirname : str
|
|
246
|
+
The directory to search in.
|
|
247
|
+
fname : str
|
|
248
|
+
The base filename without version number or extension.
|
|
249
|
+
ext : str
|
|
250
|
+
The file extension, including the dot (e.g., '.txt').
|
|
251
|
+
version_prefix : str, optional
|
|
252
|
+
The prefix used before the version number. Default is '_v'.
|
|
253
|
+
|
|
254
|
+
Returns:
|
|
255
|
+
--------
|
|
256
|
+
str or None
|
|
257
|
+
The full path of the latest version file if found, None otherwise.
|
|
258
|
+
|
|
259
|
+
Example:
|
|
260
|
+
--------
|
|
261
|
+
>>> find_latest('/path/to/dir', 'myfile', '.txt')
|
|
262
|
+
'/path/to/dir/myfile_v3.txt'
|
|
263
|
+
"""
|
|
264
|
+
version_pattern = re.compile(
|
|
265
|
+
rf"({re.escape(fname)}{re.escape(version_prefix)})(\d+)({re.escape(ext)})$"
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
glob_pattern = os.path.join(dirname, f"{fname}{version_prefix}*{ext}")
|
|
269
|
+
files = _glob(glob_pattern)
|
|
270
|
+
|
|
271
|
+
highest_version = 0
|
|
272
|
+
latest_file = None
|
|
273
|
+
|
|
274
|
+
for file in files:
|
|
275
|
+
filename = os.path.basename(file)
|
|
276
|
+
match = version_pattern.search(filename)
|
|
277
|
+
if match:
|
|
278
|
+
version_num = int(match.group(2))
|
|
279
|
+
if version_num > highest_version:
|
|
280
|
+
highest_version = version_num
|
|
281
|
+
latest_file = file
|
|
282
|
+
|
|
283
|
+
return latest_file
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
# EOF
|
scitex/io/_reload.py
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-06-04 19:10:36 (ywatanabe)"
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def reload(module_or_func, verbose=False):
|
|
7
|
+
"""
|
|
8
|
+
Reload a module or the module containing a given function.
|
|
9
|
+
|
|
10
|
+
This function attempts to reload a module directly if a module is passed,
|
|
11
|
+
or reloads the module containing the function if a function is passed.
|
|
12
|
+
This is useful during development to reflect changes without restarting the Python interpreter.
|
|
13
|
+
|
|
14
|
+
Parameters:
|
|
15
|
+
-----------
|
|
16
|
+
module_or_func : module or function
|
|
17
|
+
The module to reload, or a function whose containing module should be reloaded.
|
|
18
|
+
verbose : bool, optional
|
|
19
|
+
If True, print additional information during the reload process. Default is False.
|
|
20
|
+
|
|
21
|
+
Returns:
|
|
22
|
+
--------
|
|
23
|
+
None
|
|
24
|
+
|
|
25
|
+
Raises:
|
|
26
|
+
-------
|
|
27
|
+
Exception
|
|
28
|
+
If the module cannot be found or if there's an error during the reload process.
|
|
29
|
+
|
|
30
|
+
Notes:
|
|
31
|
+
------
|
|
32
|
+
- Reloading modules can have unexpected side effects, especially for modules that
|
|
33
|
+
maintain state or have complex imports. Use with caution.
|
|
34
|
+
- This function modifies sys.modules, which affects the global state of the Python interpreter.
|
|
35
|
+
|
|
36
|
+
Examples:
|
|
37
|
+
---------
|
|
38
|
+
>>> import my_module
|
|
39
|
+
>>> reload(my_module)
|
|
40
|
+
|
|
41
|
+
>>> from my_module import my_function
|
|
42
|
+
>>> reload(my_function)
|
|
43
|
+
"""
|
|
44
|
+
import importlib
|
|
45
|
+
import sys
|
|
46
|
+
|
|
47
|
+
if module_or_func in sys.modules:
|
|
48
|
+
del sys.modules[module_or_func]
|
|
49
|
+
importlib.reload(module_or_func)
|
|
50
|
+
|
|
51
|
+
if hasattr(module_or_func, "__module__"):
|
|
52
|
+
# If the object has a __module__ attribute, it's likely a function or class.
|
|
53
|
+
# Attempt to reload its module.
|
|
54
|
+
module_name = module_or_func.__module__
|
|
55
|
+
if module_name not in sys.modules:
|
|
56
|
+
print(f"Module {module_name} not found in sys.modules. Cannot reload.")
|
|
57
|
+
return
|
|
58
|
+
elif hasattr(module_or_func, "__name__") and module_or_func.__name__ in sys.modules:
|
|
59
|
+
# Otherwise, assume it's a module and try to get its name directly.
|
|
60
|
+
module_name = module_or_func.__name__
|
|
61
|
+
else:
|
|
62
|
+
print(
|
|
63
|
+
f"Provided object is neither a recognized module nor a function/class with a __module__ attribute."
|
|
64
|
+
)
|
|
65
|
+
return
|
|
66
|
+
|
|
67
|
+
try:
|
|
68
|
+
# Attempt to reload the module by name.
|
|
69
|
+
importlib.reload(sys.modules[module_name])
|
|
70
|
+
if verbose:
|
|
71
|
+
print(f"Successfully reloaded module: {module_name}")
|
|
72
|
+
|
|
73
|
+
except KeyError:
|
|
74
|
+
# The module is not found in sys.modules, likely due to it not being imported.
|
|
75
|
+
print(f"Module {module_name} not found in sys.modules. Cannot reload.")
|
|
76
|
+
except Exception as e:
|
|
77
|
+
# Catch any other exceptions and print an error message.
|
|
78
|
+
print(f"Failed to reload module {module_name}. Error: {e}")
|