Skip to content

Commit ff898b5

Browse files
authored
Merge pull request #772 from apdavison/flake8
fix or ignore flake8 errors and warnings; add flake8 checks to CI
2 parents 1fe6204 + 469a080 commit ff898b5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+1195
-951
lines changed

.github/workflows/full-test.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ jobs:
3131
- name: Install basic Python dependencies
3232
run: |
3333
python -m pip install --upgrade pip
34-
python -m pip install pytest pytest-cov coveralls
34+
python -m pip install pytest pytest-cov coveralls flake8
3535
python -m pip install mpi4py
3636
python -m pip install -r requirements.txt
3737
- name: Install Brian 2
@@ -60,6 +60,12 @@ jobs:
6060
pushd pyNN/neuron/nmodl
6161
nrnivmodl
6262
popd
63+
- name: Lint with flake8
64+
run: |
65+
# stop the build if there are Python syntax errors or undefined names
66+
flake8 pyNN --count --select=E9,F63,F7,F82 --show-source --statistics
67+
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
68+
flake8 pyNN --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
6369
- name: Run unit and system tests
6470
run: |
6571
pytest -v --cov=pyNN --cov-report=term test

pyNN/brian2/__init__.py

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,23 @@
66
"""
77

88
import logging
9-
import brian2
10-
from pyNN import common, space
9+
import brian2 # noqa: F401
10+
from pyNN import common, space # noqa: F401
1111
from pyNN.common.control import DEFAULT_MAX_DELAY, DEFAULT_TIMESTEP, DEFAULT_MIN_DELAY
12-
from pyNN.connectors import *
12+
from pyNN.standardmodels import StandardCellType
13+
from pyNN.connectors import * # noqa: F401, F403
14+
from pyNN.connectors import FixedProbabilityConnector
1315
from pyNN.brian2 import simulator
14-
from pyNN.brian2.standardmodels.cells import *
15-
from pyNN.brian2.standardmodels.synapses import *
16-
from pyNN.brian2.standardmodels.electrodes import *
17-
from pyNN.brian2.standardmodels.receptors import (
16+
from pyNN.brian2.standardmodels.cells import * # noqa: F401, F403
17+
from pyNN.brian2.standardmodels.synapses import * # noqa: F401, F403
18+
from pyNN.brian2.standardmodels.synapses import StaticSynapse
19+
from pyNN.brian2.standardmodels.electrodes import * # noqa: F401, F403
20+
from pyNN.brian2.standardmodels.electrodes import update_currents
21+
from pyNN.brian2.standardmodels.receptors import ( # noqa: F401
1822
CondAlphaPostSynapticResponse, AlphaPSR,
1923
CondExpPostSynapticResponse, ExpPSR,
2024
CurrExpPostSynapticResponse)
21-
from pyNN.brian2.populations import Population, PopulationView, Assembly
25+
from pyNN.brian2.populations import Population, PopulationView, Assembly # noqa: F401
2226
from pyNN.brian2.projections import Projection
2327
from pyNN.recording import get_io
2428

@@ -27,7 +31,8 @@
2731

2832
def list_standard_models():
2933
"""Return a list of all the StandardCellType classes available for this simulator."""
30-
return [obj.__name__ for obj in globals().values() if isinstance(obj, type) and issubclass(obj, StandardCellType)]
34+
return [obj.__name__ for obj in globals().values()
35+
if isinstance(obj, type) and issubclass(obj, StandardCellType)]
3136

3237

3338
def setup(timestep=DEFAULT_TIMESTEP, min_delay=DEFAULT_MIN_DELAY,
@@ -48,7 +53,7 @@ def setup(timestep=DEFAULT_TIMESTEP, min_delay=DEFAULT_MIN_DELAY,
4853
simulator.state.num_processes = 1
4954

5055
simulator.state.network.add(
51-
NetworkOperation(update_currents, when="start", clock=simulator.state.network.clock)
56+
brian2.NetworkOperation(update_currents, when="start", clock=simulator.state.network.clock)
5257
)
5358
return rank()
5459

pyNN/brian2/cells.py

Lines changed: 2 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import numpy as np
1111
import brian2
12+
from functools import reduce
1213
from pyNN.parameters import Sequence, simplify
1314
from pyNN.core import is_listlike
1415
from pyNN import errors
@@ -156,13 +157,10 @@ def tau_refrac(self):
156157

157158
@tau_refrac.setter
158159
def tau_refrac(self, tau_refrac_value):
159-
#self._refracvalue = tau_refrac_value * ms
160-
#brian2.NeuronGroup.__setattr__(self, 'tau_refrac', tau_refrac_value)
161160
self._refractory = tau_refrac_value
162161

163162
@v_reset.setter
164163
def v_reset(self, resetvalue):
165-
#self._resetvalue = resetvalue * mV
166164
self.event_codes['spike'] = 'v = {}*mV'.format(resetvalue / mV)
167165

168166

@@ -189,17 +187,6 @@ def __init__(self, n, equations, **parameters):
189187
reset = 'v = {}*mV; g_r+= {}*nS; g_s+={}*nS'.format(
190188
self._resetvalue / mV, self._q_rvalue / nS, self._q_svalue / nS)
191189
refractory = self._refracvalue
192-
'''
193-
threshold = brian2.SimpleFunThreshold(self.check_threshold)
194-
period = simplify(parameters['tau_refrac'])
195-
assert not hasattr(period, "__len__"), "Brian2 does not support heterogenerous refractory periods with CustomRefractoriness"
196-
reset = brian2.SimpleCustomRefractoriness(
197-
AdaptiveReset2(parameters.pop('v_reset'),
198-
parameters.pop('q_r'),
199-
parameters.pop('q_s')),
200-
period=period * second)
201-
refractory = None
202-
'''
203190
BaseNeuronGroup.__init__(self, n, equations,
204191
threshold, reset=reset, refractory=refractory,
205192
method="rk2", **parameters)
@@ -222,24 +209,12 @@ def tau_refrac(self):
222209

223210
@tau_refrac.setter
224211
def tau_refrac(self, tau_refrac_value):
225-
#self._refracvalue = tau_refrac_value * ms
226-
#brian2.NeuronGroup.__setattr__(self, 'tau_refrac', tau_refrac_value)
227212
self._refractory = tau_refrac_value
228213

229214
@v_reset.setter
230215
def v_reset(self, resetvalue):
231-
#self._resetvalue = resetvalue * mV
232216
self.event_codes['spike'] = 'v = {}*mV'.format(resetvalue / mV)
233217

234-
'''
235-
tau_refrac = _new_property('', '_refractory_array', ms)
236-
v_reset = _new_property('_resetfun.resetfun', 'v_reset', mV)
237-
q_r = _new_property('_resetfun.resetfun', 'q_r', nA)
238-
q_s = _new_property('_resetfun.resetfun', 'q_s', nA)
239-
240-
def check_threshold(self, v):
241-
return v >= self.v_thresh
242-
'''
243218

244219
# The below can be replaced by
245220
# reset = '''v = v_reset
@@ -260,28 +235,14 @@ def __call__(self, P, spikes):
260235
class IzhikevichNeuronGroup(BaseNeuronGroup):
261236

262237
def __init__(self, n, equations, **parameters):
263-
#threshold = brian2.SimpleFunThreshold(self.check_threshold)
264-
#threshold = 'v >= {}*mV'.format(parameters["v_thresh"][0]*1000)
265238
threshold = 'v >= 30*mV'
266239
self._resetvalue = parameters.pop('v_reset')[0]
267240
self._dvalue = parameters.pop('d')[0]
268241
reset = 'v = {}*mV; u+={}*mV/ms'.format(self._resetvalue / mV, self._dvalue / (mV/ms))
269-
'''
270-
reset = brian2.SimpleCustomRefractoriness(
271-
IzhikevichReset(parameters['v_reset'],
272-
parameters['d']),
273-
period=0 * ms)
274-
'''
275242
refractory = 0 * ms
276243
BaseNeuronGroup.__init__(self, n, equations,
277244
threshold=threshold, reset=reset, refractory=refractory,
278245
**parameters)
279-
#self._variable_refractory_time = True
280-
#self._refractory_variable = None
281-
#self._S0 = self._S[:, 0]
282-
283-
#v_reset = _new_property('_resetfun.resetfun', 'Vr', mV)
284-
#b = _new_property('_resetfun.resetfun', 'b', nA)
285246

286247
@property
287248
def v_reset(self):
@@ -293,7 +254,6 @@ def d(self):
293254

294255
@v_reset.setter
295256
def v_reset(self, resetvalue):
296-
#self._resetvalue = resetvalue * mV
297257
self.event_codes['spike'] = 'v = {}*mV'.format(resetvalue / mV)
298258

299259

@@ -339,7 +299,7 @@ def __init__(self, n, equations, spike_time_sequences=None):
339299
def _convert_sequences_to_arrays(self, spike_time_sequences):
340300
times = np.concatenate([seq.value for seq in spike_time_sequences])
341301
indices = np.concatenate([i * np.ones(seq.value.size)
342-
for i, seq in enumerate(spike_time_sequences)])
302+
for i, seq in enumerate(spike_time_sequences)])
343303
return indices, times * second
344304
# todo: try to push the multiplication by seconds back into the translation step.
345305
# note that the scaling from ms to seconds does take place during translation

pyNN/brian2/populations.py

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,7 @@
99
from pyNN.parameters import ArrayParameter, ParameterSpace, simplify, LazyArray
1010
from . import simulator
1111
from .recording import Recorder
12-
import numpy as np
13-
from brian2.units.fundamentalunits import Quantity
14-
#from brian2.units import *
15-
#from quantities import *
16-
from brian2.core.variables import VariableView
1712
import brian2
18-
#from brian2.groups.neurongroup import *
1913
ms = brian2.ms
2014
mV = brian2.mV
2115

@@ -34,7 +28,8 @@ def _get_parameters(self, *names):
3428
"""
3529
def _get_component_parameters(component, names, component_label=None):
3630
if component.computed_parameters_include(names):
37-
native_names = component.get_native_names() # need all parameters in order to calculate values
31+
# need all parameters in order to calculate values
32+
native_names = component.get_native_names()
3833
else:
3934
native_names = component.get_native_names(*names, suffix=component_label)
4035
native_parameter_space = self._get_native_parameters(*native_names)
@@ -67,10 +62,12 @@ def _get_component_parameters(component, names, component_label=None):
6762
else:
6863
parameter_space = ParameterSpace({})
6964
for component_label, names in names_by_component.items():
70-
parameter_space.add_child(component_label,
71-
_get_component_parameters(self.celltype.post_synaptic_receptors[component_label],
72-
names_by_component[component_label],
73-
component_label))
65+
parameter_space.add_child(
66+
component_label,
67+
_get_component_parameters(
68+
self.celltype.post_synaptic_receptors[component_label],
69+
names_by_component[component_label],
70+
component_label))
7471
else:
7572
parameter_space = _get_component_parameters(self.celltype, names)
7673
else:
@@ -85,7 +82,8 @@ class PopulationView(common.PopulationView, PopulationMixin):
8582
def _get_parameters(self, *names):
8683
if isinstance(self.celltype, StandardCellType):
8784
if any(name in self.celltype.computed_parameters() for name in names):
88-
native_names = self.celltype.get_native_names() # need all parameters in order to calculate values
85+
# need all parameters in order to calculate values
86+
native_names = self.celltype.get_native_names()
8987
else:
9088
native_names = self.celltype.get_native_names(*names)
9189
native_parameter_space = self._get_native_parameters(*native_names)
@@ -136,9 +134,9 @@ class Population(common.Population, PopulationMixin):
136134

137135
def _create_cells(self):
138136
id_range = np.arange(simulator.state.id_counter,
139-
simulator.state.id_counter + self.size)
137+
simulator.state.id_counter + self.size)
140138
self.all_cells = np.array([simulator.ID(id) for id in id_range],
141-
dtype=simulator.ID)
139+
dtype=simulator.ID)
142140
# all cells are local. This doesn't seem very efficient.
143141
self._mask_local = np.ones((self.size,), bool)
144142

pyNN/brian2/projections.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88
from collections import defaultdict
99
import numpy as np
1010
import brian2
11-
from brian2 import uS, nA, mV, ms, second
11+
from brian2 import uS, nA, mV, ms
1212
from pyNN import common
1313
from pyNN.standardmodels.synapses import TsodyksMarkramSynapse
1414
from pyNN.core import is_listlike
15-
from pyNN.parameters import ParameterSpace, simplify
15+
from pyNN.parameters import ParameterSpace
1616
from pyNN.space import Space
1717
from . import simulator
1818
from .standardmodels.synapses import StaticSynapse
@@ -112,7 +112,10 @@ def __init__(self, presynaptic_population, postsynaptic_population,
112112
# complete the synapse type equations according to the
113113
# post-synaptic response type
114114
psv = post.celltype.post_synaptic_variables[self.receptor_type]
115-
if hasattr(post.celltype, "voltage_based_synapses") and post.celltype.voltage_based_synapses:
115+
if (
116+
hasattr(post.celltype, "voltage_based_synapses")
117+
and post.celltype.voltage_based_synapses
118+
):
116119
weight_units = mV
117120
else:
118121
weight_units = post.celltype.conductance_based and uS or nA
@@ -222,10 +225,12 @@ def _convergent_connect(self, presynaptic_indices, postsynaptic_index,
222225
except TypeError as err:
223226
if "read-only" in str(err):
224227
logger.info(
225-
"Cannot set synaptic initial value for variable {}".format(name))
228+
f"Cannot set synaptic initial value for variable {name}")
226229
else:
227230
raise
228-
# brian2_var[i, j] = value # doesn't work with multiple connections between a given neuron pair. Need to understand the internals of Synapses and SynapticVariable better
231+
# brian2_var[i, j] = value
232+
# ^ doesn't work with multiple connections between a given neuron pair.
233+
# Need to understand the internals of Synapses and SynapticVariable better
229234

230235
def _set_attributes(self, connection_parameters):
231236
if isinstance(self.post, common.Assembly) or isinstance(self.pre, common.Assembly):
@@ -288,7 +293,8 @@ def _get_attributes_as_list(self, attribute_names):
288293
value = getattr(syn_obj, name)[:]
289294
# should really use the translated name
290295
native_ps = ParameterSpace({name: value}, shape=value.shape)
291-
# this whole "get attributes" thing needs refactoring in all backends to properly use translation
296+
# todo: this whole "get attributes" thing needs refactoring
297+
# in all backends to properly use translation
292298
ps = self.synapse_type.reverse_translate(native_ps)
293299
ps.evaluate()
294300
value = ps[name]

pyNN/brian2/recording.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,9 @@
55
"""
66

77
import logging
8-
from collections import defaultdict
98
import numpy as np
109
import quantities as pq
1110
import brian2
12-
from pyNN.core import is_listlike
1311
from pyNN import recording
1412
from . import simulator
1513

@@ -27,7 +25,6 @@ class Recorder(recording.Recorder):
2725
_simulator = simulator
2826

2927
def __init__(self, population=None, file=None):
30-
__doc__ = recording.Recorder.__doc__
3128
recording.Recorder.__init__(self, population, file)
3229
self._devices = {} # defer creation until first call of run()
3330

@@ -37,7 +34,8 @@ def _create_device(self, group, variable):
3734
if variable == 'spikes':
3835
self._devices[variable] = brian2.SpikeMonitor(group, record=self.recorded)
3936
else:
40-
varname = self.population.celltype.state_variable_translations[variable]['translated_name']
37+
translations = self.population.celltype.state_variable_translations
38+
varname = translations[variable]['translated_name']
4139
neurons_to_record = np.sort(np.fromiter(
4240
self.recorded[variable], dtype=int)) - self.population.first_id
4341
self._devices[variable] = brian2.StateMonitor(group, varname,
@@ -89,8 +87,8 @@ def _get_all_signals(self, variable, ids, clear=False):
8987
values = getattr(device, varname).T
9088
else:
9189
raise NotImplementedError # todo - construct a mask to get only the desired signals
92-
values = self.population.celltype.state_variable_translations[variable]['reverse_transform'](
93-
values)
90+
translations = self.population.celltype.state_variable_translations
91+
values = translations[variable]['reverse_transform'](values)
9492
# because we use `when='end'`, need to add the value at the beginning of the run
9593
tmp = np.empty((values.shape[0] + 1, values.shape[1]))
9694
tmp[1:, :] = values
@@ -109,6 +107,5 @@ def _local_count(self, variable, filter_ids=None):
109107
indices = np.fromiter(filtered_ids, dtype=int) - padding
110108
spiky = self._devices['spikes'].spike_trains()
111109
for i, id in zip(indices, filtered_ids):
112-
#N[id] = len(self._devices['spikes'].spiketimes[i])
113110
N[id] = len(spiky[i])
114111
return N

pyNN/brian2/simulator.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import brian2
2525
import numpy as np
2626
from pyNN import common
27-
from pyNN.parameters import simplify
2827

2928

3029
name = "Brian2"
@@ -113,7 +112,8 @@ def _get_min_delay(self):
113112
if np.isinf(min_delay):
114113
self._min_delay = self.dt
115114
else:
116-
self._min_delay = min_delay * self.dt # Synapses.delay is an integer, the number of time steps
115+
# Synapses.delay is an integer, the number of time steps
116+
self._min_delay = min_delay * self.dt
117117
return self._min_delay
118118

119119
def _set_min_delay(self, delay):

0 commit comments

Comments
 (0)