You can't use *args with other positional arguments following; positions is regarded as a keyword-only argument instead. Because it has no default value, it is still required.
Either give positions a default value to remove the requirement that it is always specified when calling:
def somef(*iterable_objs, positions=None):
if positions is None:
# calculate a default instead
positions = range(len(iterable_objs))
or pass in a positions keyword argument explicitly:
somef([1,2,3], 'abc', positions=(4,5,6))
Side-note: never use print() to signal an error condition. The end user doesn't want to know that the programmer made a mistake, the program needs to hear about the error. Use raise SomeException() instead.
iterable_objsto capture all but the last positional argument andpositionsto capture the last? Did you wantpositionsto be keyword-only, but have the try-except handle what happens whenpositionsisn't provided? Were you trying to do something else?iterable_objs) and last one ispositionsONLY if key word is includedpositionsisn't provided. Catching exceptions is a bad thing if there's nothing you can reasonably do about them, as seems to be the case here.