In the dynamicly typed programming languages I know, duck typing means you have an object with a well defined interface, properties with certain names, that are passed along with the object into other functions, which barf when trying to call back a property that's not there. So every object that supplies a method toInteger(X) can be treated like an integer, so e.g. 1+'a' == 50 in most codes, but they disagree on how to form "a1" from 'a' and 1; some allow 'a'+1, some don't, which depends on how the operator is defined, which isn't always implemented as property, but as built-in function.
Equivalently, people frequently barf upon interpreting "Alice, Bob and me". Some employ type coercion, applying toSubject on the fly, others say that's inefficient, who prefer to be strict and test isSubject
Similarly, even native speakers quarrel about the number inflection for to be after conjunctions of various number (a paper and three publications [is/are]) because they are not sure what the highly polysemous and does.
So, no, from a descriptive stand point you cannot decide simply from observation when you observe contradictory situations.