I think that this is either a great idea or pointless, depending on what the built-in actually does.
If all it does is literally the debug print function you give:
# "debug print": prints and then returns its argument def dp(obj): print(repr(obj)) return obj
then it is just a trivial helper as you say, and in my opinion too trivial to bother making a builtin. As far as discoverability by beginners, I think that having their instructor teach them to write such a simple helper would be a good lesson.
But suppose we were willing to add a bit of compiler magic to the language, something that would be hard to do in pure Python: give dp() access to the source code of the argument it is called with, and then print out that source as well as the value's repr, plus the line number and name of the module it is called from.
# module.py x = 1 y = dp(x + 99)+2 print("y is", y)
Then running that module would output:
Line 2 of module.py, "x + 99", result 100 y is 102
Compare that to the pretty anaemic output of the dp() helper you give:
100 y is 102
I know which I would rather see when debugging.
Obviously dp() would have to be magic. There's no way that I know of for a Python function to see the source code of its own arguments. I have no idea what sort of deep voodoo would be required to make this work. But if it could work, wow, that would really be useful. And not just for beginners.
Objection 1: dp() looks like an ordinary function call. Magic in Python is usually a statement, like assert.
Answer: Very true. But on the other hand, there's super() inside classes.
Objection 2: Yes, but even super() isn't this magical.
Answer: Details, details. I'm just the ideas man, somebody else can work out the implementation... *wink*
Objection 3: What if the caller has shadowed or replaced dp()?
Answer: Don't do that. Let's make dp() a reserved name.
Objection 4: You're kidding, right? That needs a full deprecation cycle, it will break code, etc.
Answer: Okay, okay. Maybe the compiler could be smart enough to only pass the extra information on (line number, module, source code of argument) when dp() is the actual genuine builtin dp() function, and not if it has been shadowed.
Objection 5: Even if there is a way to do that, it would require an expensive runtime check that will slow down calls to anything called dp().
Answer: Yes, but that's only one name out of millions. All other function calls will be unaffected. And besides, performance regressions don't count as breakage. Much.
Yeah, I don't think this is going to fly either. But boy would it be useful if it could...