stack-overflow-import icon indicating copy to clipboard operation
stack-overflow-import copied to clipboard

Make the imported module callable

Open Xion opened this issue 5 years ago • 2 comments

While this marvelous library is obviously saving everyone a lot of time going back and forth between SO, clipboard, and their IDE, I feel its usage is still not as straightforward as it could be.

For example, in this snippet:

from stackoverflow import split_into_chunks
print(list(split_into_chunks.chunk("very good chunk func")))

you still need to know to call a chunk function from the imported module. It could've been chunks, split, or whatever else (depending on what the SO answer chose), forcing the programmer to (gasp!) look at the code he or she imports and perhaps even understand it.

I'd suggest that the importer should be clever enough to pick the correct function for the programmer, and then make the imported symbol itself callable:

from stackoverflow import split_into_chunks
print(list(split_into_chunks("very good chunk func")))

The heuristics of making the correct choice are left as exercise for the reader.

Xion avatar Sep 25 '18 09:09 Xion

Maybe it could look for an answer which contains a def block; if there are multiple def blocks, find the one that isn't called from the others.

xigoi avatar Sep 12 '19 13:09 xigoi

Additional heuristic: in code blocks which contain viable executable code theoretically applicable to the problem, bare / outside the scope of a declared function, isolate the initial literal assignment(s) (which is/are most typically the sample input value(s) in short code demonstrations), remove it/them, and use the labels as the argument names of the generated callable. (Any trailing print call may be suitable for transformation into the final return.)

E.g. this following bare snippet in answer to "how do you multiply two numbers together":

x = 27
y = 42
print(x * y)

Would transform to, if imported as "multiply":

def multiply(x, y):
    return x * y

amcgregor avatar May 16 '20 07:05 amcgregor