В конечном счете, любой модуль, реализующий это поведение, собирается проанализировать строку. И действовать в соответствии с результатом. Например, в feedparser они разбирают URL:
if urlparse.urlparse(url_file_stream_or_string)[0] in ('http', 'https', 'ftp'):
# do something with the url
else:
# This is a file path
return open(url_file_stream_or_string)
Вот хороший декоратор, который сделает это за вас:
import urlparse, urllib
def opener(fun):
def wrapper(url):
if urlparse.urlparse(url)[0] in ('http', 'https', 'ftp'):
return fun(urllib.urlopen(url))
return fun(open(url))
return wrapper
@opener
def read(stream):
return stream.read()
read('myfile')
read('http://www.wikipedia.org')