Comments (8)
The feature would be useful. Here is my use case
Use case: I have a SwerveDrive class that coordinates four SwerveModules. I would like to add them to a dictionary with labels rr_motor
, rl_motor
, fr_motor
, fl_motor
this would make it much clearer when writing code. However currently am unable to do this in the constructor because the modules have not been injected yet.
from robotpy-wpilib-utilities.
The feature would be useful. Here is my use case
I fixed this by using the setup() function from magic components.
from robotpy-wpilib-utilities.
One solution to this that occurs to me is that when magicbot is creating an instance, it could create at runtime a subclass of the instance class, and override __init__
with a custom constructor that would perform magicbot injections. This would allow components to have constructors that can access the injected variables.
from robotpy-wpilib-utilities.
Here's an crazy idea: we do DI on the constructor arguments. i.e. instead of this:
class Component:
spam: Egg
ham: Egg
One would have this:
class Component:
def __init__(self, spam: Egg, ham: Egg):
...
The user would then be responsible for setting the attributes in the constructor themselves.
Obvious caveat here is that you can't have cyclic dependencies like this, but I suppose you really shouldn't in the first place?
from robotpy-wpilib-utilities.
That's a neat idea, but adds boilerplate because the user would need to set the attributes themselves.
from robotpy-wpilib-utilities.
Can't believe I never thought of this until now, but it seems you can call __new__
before calling __init__
... soo we could do that? Not sure what terrible ramifications there would be to doing thing (presumably cause potential ordering problems if objects tried to use other non-initialized objects?)
class X:
def __init__(self):
print("init")
x = X.__new__(X)
print("new", x)
X.__init__(x)
print(x)
Prints out
new <__main__.X object at 0x10c4b5f28>
init
<__main__.X object at 0x10c4b5f28>
from robotpy-wpilib-utilities.
Looking back at this, I'm still a fan of the DI on __init__
args idea. From the user perspective, it's simple and possibly easier to understand than what we do now.
adds boilerplate because the user would need to set the attributes themselves
Good thing dataclasses
mean the boilerplate isn't a problem
from robotpy-wpilib-utilities.
With #204 we now do dependency injection when instantiating components, in addition to the existing behaviour. It still needs to be documented though.
We may also want to reverse the order in which components are instantiated to make it more useful, although that may be confusing when looking at startup logs?
from robotpy-wpilib-utilities.
Related Issues (20)
- AutonomousModeSelector: Consider allowing teams to use own timings HOT 1
- Autonomous repeats when you end with a timed_state HOT 2
- NotifierDelay is broken
- Calling the super() methods in robot.py is required for command code, but outputs a warning that they need to be overridden. HOT 5
- Autonomous mode test cycler doesn't work HOT 1
- magicbot: Running teleop code during autonomous HOT 3
- magicbot: Add tunable setter
- magicbot: tunables shuffleboard integration ala oblog HOT 1
- AttributeError: "SimpleWatchdog" object has no attribute "printEpochs" HOT 6
- Simple WatchDog Object has no attribute printEpochs HOT 1
- New command-based framework HOT 11
- magicbot doesn't understand the typing module
- will_reset_to resets before the execute method in a component when using StateMachines HOT 1
- segfault HOT 2
- Cannot import commandbased HOT 1
- Move commandbased to robotpy-commands-v1
- MagicRobot does not execute setup or execute after injection HOT 2
- Add simulation support for distance sensors
- magicbot: use ntcore poller instead of callbacks?
- magicbot mode exit methods HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from robotpy-wpilib-utilities.