I disagree.
If you want to obtain the join of a single element E, you can use
foo([E]), foo((E,)), or foo({E}), or any iterable that contains just E.
This works even if such an iterable is an element of the poset.
Anyway, the join of a single element is not very useful (since it is the
element itself). Hence using the one-argument version of the function
for iterables seems quite innocent an abuse to me.
Without "args in self" things are just simpler. If you give one
argument, you know that it will be interpreted as an iterable of
elements. If you give some other number of arguments, you know that
these arguments will be interpreted as elements. You don't need to
know anything about the actual elements of the poset to figure out what
what will happen.
Finally there is a bug when you add "args in self": Suppose that have
added "args in self" and called the new function foo'. Suppose
furthermore that you have a (facade) poset with elements x, y, and
E=(x,y). Now foo'(x,y) has args==(x,y)==E and therefore returns E
regardless of the order in the poset, which is not what is wanted from
foo'(x,y).
Regards,
Erik Massop