Open jmason42 opened 6 years ago
Agreed.
Q: How to find cases that need to change from /
to //
?
Most files already have the division
import; I was really aggressive about this. Probably some sort of find
command could locate all *.py
files that lack the line. That hopefully leaves a handful of cases to inspect manually.
Just out of curiosity I took a look through the Process
subclass files; equilibrium.py
, tf_binding.py
, and two_component_system.py
are the only ones to lack the import, and in the few cases where they use the division operator on numbers, floating-point division is the intention. I think most other groups of code will be easy to fix (everything in the wholecell
module, for example, has pretty clear intentions). The really scary chunk is the analysis scripts. For those I can imagine running via PyCharm would be extremely helpful, since we could inspect types and values, and then see where they are used. It's a shame analysis scripts aren't more standardized, but that sounds almost as difficult as building a GUI library.
We've begun implementing this piecemeal as well as two other imports, ala
from __future__ import absolute_import, division, print_function
While I won't be able to scan the code until Sunday (running from the Allen Foundation seminar), something like this should work:
grep -Rv 'import .* division'
There's an open issue about future division compatibility vs. the units code. That needs debugging.
A working command:
fd '^[^_].*py$' -I | xargs grep -L 'import.\+division'
finds 150 files that don't import division
.
(The fd utility is an easier and faster utility than find
. Here, I used a filename regex to ignore the __init__.py
files. By default it skips .gitignore
d and hidden files, and apparently it alphabetizes the filenames better than find
):
models/ecoli/analysis/cohort/centralCarbonMetabolismScatter.py
models/ecoli/analysis/cohort/doubling_times_histogram_all.py
models/ecoli/analysis/cohort/expression_dynamics.py
models/ecoli/analysis/cohort/growthDynamics.py
models/ecoli/analysis/cohort/initialVsFinalMass.py
models/ecoli/analysis/cohort/mass_fraction_instantaneous_growth_rates.py
models/ecoli/analysis/cohort/proteinFoldChangeVsTranscriptionFrequency.py
models/ecoli/analysis/cohort/transcriptFrequency.py
models/ecoli/analysis/cohort/transcriptionGenomeCoverage.py
models/ecoli/analysis/cohort/transcriptionGenomeCoverageSecondHalf.py
models/ecoli/analysis/multigen/cellCycleLength.py
models/ecoli/analysis/multigen/centralCarbonMetabolismScatter.py
models/ecoli/analysis/multigen/environmental_shift_fluxes.py
models/ecoli/analysis/multigen/functionalUnits.py
models/ecoli/analysis/multigen/functionalUnitsFC.py
models/ecoli/analysis/multigen/limitedEnzymeGlutcyslig.py
models/ecoli/analysis/multigen/limitedEnzymeUgd.py
models/ecoli/analysis/multigen/massFractionSummary.py
models/ecoli/analysis/multigen/massFractionToUnity.py
models/ecoli/analysis/multigen/massShift.py
models/ecoli/analysis/multigen/mene_limitations.py
models/ecoli/analysis/multigen/probProteinExistAndDouble.py
models/ecoli/analysis/multigen/proteinAvgCountVsBurstSize.py
models/ecoli/analysis/multigen/proteinCountVsFoldChange.py
models/ecoli/analysis/multigen/proteinExistVsBurstSize.py
models/ecoli/analysis/multigen/proteinFoldChangeVsRnaDeg.py
models/ecoli/analysis/multigen/proteinFoldChangeVsTranscriptionEvents.py
models/ecoli/analysis/multigen/proteinFoldChangeVsTranslationEff.py
models/ecoli/analysis/multigen/replication.py
models/ecoli/analysis/multigen/rnaVsProteinPerCell.py
models/ecoli/analysis/multigen/rna_decay_03_high.py
models/ecoli/analysis/multigen/subgenerationalTranscription.py
models/ecoli/analysis/multigen/transcriptionEvents.py
models/ecoli/analysis/multigen/transcriptionFrequency.py
models/ecoli/analysis/multigen/transcriptionFrequencyOrdered.py
models/ecoli/analysis/multigen/transcriptionGenomeCoverage.py
models/ecoli/analysis/multigen/translationFrequency.py
models/ecoli/analysis/single/aaCounts.py
models/ecoli/analysis/single/aaExchangeFluxes.py
models/ecoli/analysis/single/allReactionFluxes.py
models/ecoli/analysis/single/concentrationDeviation.py
models/ecoli/analysis/single/dntpCounts.py
models/ecoli/analysis/single/equilibriumComparison.py
models/ecoli/analysis/single/expression_rna_01_low.py
models/ecoli/analysis/single/expression_rna_02_med.py
models/ecoli/analysis/single/expression_rna_03_high.py
models/ecoli/analysis/single/glucoseAndOxygenExchangeFluxes.py
models/ecoli/analysis/single/massFractionSummary.py
models/ecoli/analysis/single/massFractions.py
models/ecoli/analysis/single/ntpCounts.py
models/ecoli/analysis/single/ribosome30SCounts.py
models/ecoli/analysis/single/ribosome50SCounts.py
models/ecoli/analysis/single/rnapCounts.py
models/ecoli/analysis/single/rnaseCounts.py
models/ecoli/analysis/single/twoComponentSystem.py
models/ecoli/analysis/variant/adder_sizer.py
models/ecoli/analysis/variant/doubling_time_histogram.py
models/ecoli/analysis/variant/growthConditionComparison.py
models/ecoli/analysis/variant/growth_condition_comparison_validation.py
models/ecoli/analysis/variant/massFractionSummary.py
models/ecoli/analysis/variant/meneSensitivity.py
models/ecoli/analysis/variant/tfFit.py
models/ecoli/analysis/variant/tfFitComparison.py
models/ecoli/analysis/variant/tfTarget.py
models/ecoli/processes/equilibrium.py
models/ecoli/processes/tf_binding.py
models/ecoli/sim/simulation.py
models/ecoli/sim/variants/all_shuffle_params.py
models/ecoli/sim/variants/catalyst_shuffle_params.py
models/ecoli/sim/variants/condition.py
models/ecoli/sim/variants/gene_knockout.py
models/ecoli/sim/variants/kinetic_catalyst_shuffle_params.py
models/ecoli/sim/variants/kinetic_target_shuffle_params.py
models/ecoli/sim/variants/mene_params.py
models/ecoli/sim/variants/metabolism_kinetic_objective_weight.py
models/ecoli/sim/variants/monomer_deg_rate_shuffle_params.py
models/ecoli/sim/variants/nutrient_time_series.py
models/ecoli/sim/variants/rna_deg_rate_shuffle_params.py
models/ecoli/sim/variants/tf_activity.py
models/ecoli/sim/variants/transcription_initiation_shuffle_params.py
models/ecoli/sim/variants/translation_efficiencies_shuffle_params.py
models/ecoli/sim/variants/wildtype.py
prototypes/metabolism/baserates_modularFBA_toy_model.py
prototypes/metabolism/homeostaticFBA_modularFBA_toy_model/homeostatic_FBA_modular_FBA_toy_model.py
prototypes/metabolism/modularHomeostaticFbaToyModel.py
prototypes/metabolism/moma_modularFBA_toy_model.py
prototypes/metabolism/normalized_moma_modularFBA_toy_model.py
prototypes/metabolism/test_model.py
prototypes/metabolism/unconstrained_modularFBA_toy_model.py
prototypes/metabolism/unconstrained_toy_model.py
reconstruction/ecoli/compendium/growth_data.py
reconstruction/ecoli/dataclasses/process/equilibrium.py
reconstruction/ecoli/dataclasses/process/equilibrium_odes.py
reconstruction/ecoli/dataclasses/process/two_component_system_odes.py
reconstruction/ecoli/dataclasses/process/two_component_system_odes_fitter.py
reconstruction/ecoli/dataclasses/state/stateFunctions.py
reconstruction/ecoli/flat/scripts/biomassMetaboliteMod.py
reconstruction/ecoli/flat/scripts/get_charged_masses.py
reconstruction/ecoli/flat/scripts/kb_to_flat.py
reconstruction/ecoli/flat/scripts/load_save_tsv.py
reconstruction/ecoli/flat/scripts/massfrac_flat.py
reconstruction/ecoli/flat/scripts/metweights2.py
reconstruction/ecoli/flat/scripts/other_weights.py
reconstruction/ecoli/flat/scripts/unifyBulkFiles.py
reconstruction/spreadsheets.py
runscripts/animations/chromosome_svg.py
runscripts/debug/summarize_environment.py
runscripts/fileManipulation/addNonPdfPlots.py
runscripts/fileManipulation/convertToVariantSimulation.py
runscripts/fileManipulation/deleteEmptySims.py
runscripts/fireworks/fw_queue.py
runscripts/fittingAnalysis/synthetaseTurnover.py
runscripts/manual/load_sim_data.py
runscripts/reconstruction/build_complexation_reactions.py
runscripts/reconstruction/reaction_enzymes.py
runscripts/reconstruction/reaction_mass_balance.py
runscripts/reconstruction/update_proteins_location.py
setup.py
user/MultiprocessingTest.py
user/add_to_test_tablereader_writer.py
user/argparse-trials.py
user/eval_comparison.py
user/mp_test.py
validation/ecoli/validation_data_raw.py
wholecell/analysis/analysis_tools.py
wholecell/analysis/plotting_tools.py
wholecell/fireworks/firetasks/initRawData.py
wholecell/fireworks/firetasks/initRawValidationData.py
wholecell/fireworks/firetasks/initValidationData.py
wholecell/fireworks/firetasks/simulation.py
wholecell/fireworks/firetasks/simulationDaughter.py
wholecell/fireworks/firetasks/symlink.py
wholecell/fireworks/initialize.py
wholecell/listeners/listener.py
wholecell/states/environment.py
wholecell/tests/utils/profile_polymerize.py
wholecell/tests/utils/test_library_performance.py
wholecell/tests/utils/test_polymerize.py
wholecell/tests/utils/test_unit_struct_array.py
wholecell/utils/config.py
wholecell/utils/constants.py
wholecell/utils/enzymeKinetics.py
wholecell/utils/fitting.py
wholecell/utils/forkedPdb.py
wholecell/utils/parallelization.py
wholecell/utils/profiler.py
wholecell/utils/sparkline.py
wholecell/utils/unit_struct_array.py
wholecell/utils/units.py
wholecell/utils/write_ode_file.py
Lots of bugs are consequent of Python 2's default integer division behavior, which is changed in Python 3 to return a float (while the
//
operator handles the old behavior). For this reason I tried to addto every file. I think we should enforce this, and further, we should consider adding other imports, like the new function-based
print
and forced absolute importing. This will reduce the likelihood of bugs and maximize compatibility with a potential switch to Python 3.