我认为这是不可能的,但无论如何我要问,也许我会学到一些东西。
假设我有一段代码,来自我想要使用的外部模块:
from __future__ import print_function
import webbrowser
import time
from .api import Twitter, json
from .oauth import OAuth, write_token_file
from .oauth2 import OAuth2, write_bearer_token_file
try:
_input = raw_input
except NameError:
_input = input
def oauth_dance(app_name, consumer_key, consumer_secret, token_filename=None):
"""
Perform the OAuth dance with some command-line prompts. Return the
oauth_token and oauth_token_secret.
Provide the name of your app in `app_name`, your consumer_key, and
consumer_secret. This function will open a web browser to let the
user allow your app to access their Twitter account. PIN
authentication is used.
If a token_filename is given, the oauth tokens will be written to
the file.
"""
print("Hi there! We're gonna get you all set up to use %s." % app_name)
twitter = Twitter(
auth=OAuth('', '', consumer_key, consumer_secret),
format='', api_version=None)
oauth_token, oauth_token_secret = parse_oauth_tokens(
twitter.oauth.request_token(oauth_callback="oob"))
print("""
In the web browser window that opens please choose to Allow
access. Copy the PIN number that appears on the next page and paste or
type it here:
""")
oauth_url = ('https://api.twitter.com/oauth/authorize?oauth_token=' +
oauth_token)
print("Opening: %s\n" % oauth_url)
try:
r = webbrowser.open(oauth_url)
time.sleep(2) # Sometimes the last command can print some
# crap. Wait a bit so it doesn't mess up the next
# prompt.
if not r:
raise Exception()
except:
print("""
Uh, I couldn't open a browser on your computer. Please go here to get
your PIN:
""" + oauth_url)
oauth_verifier = _input("Please enter the PIN: ").strip()
twitter = Twitter(
auth=OAuth(
oauth_token, oauth_token_secret, consumer_key, consumer_secret),
format='', api_version=None)
oauth_token, oauth_token_secret = parse_oauth_tokens(
twitter.oauth.access_token(oauth_verifier=oauth_verifier))
if token_filename:
write_token_file(
token_filename, oauth_token, oauth_token_secret)
print()
print("That's it! Your authorization keys have been written to %s." % (
token_filename))
return oauth_token, oauth_token_secret
我正在调用这样有趣的函数:
twitter.oauth_dance("My App Name", CONSUMER_KEY, CONSUMER_SECRET, MY_TWITTER_CREDS)
我想更改输入方法(请参阅代码的开头,在try块中),但不更改模块的代码。我想从用户那边做。
有可能吗?
编辑:
一个不起作用的例子:
import twitter
twitter.oauth_dance._input = None
# twitter._input = None
CONSUMER_KEY = 'hi'
CONSUMER_SECRET = 'hello'
MY_TWITTER_CREDS = './config/twitter_credentials'
if not os.path.exists(MY_TWITTER_CREDS):
twitter.oauth_dance("My App Name", CONSUMER_KEY,
CONSUMER_SECRET, MY_TWITTER_CREDS)
oauth_token, oauth_secret = twitter.read_token_file(MY_TWITTER_CREDS)
tweet = twitter.Twitter(auth=twitter.OAuth(oauth_token, oauth_secret,
CONSUMER_KEY, CONSUMER_SECRET))
tweet.statuses.update(status='Hello, world!')
答案 0 :(得分:0)
在这种情况下,您可以说modulename._input = custom_input
#my_module.py
def hello():
print('hello')
_func = hello
def test():
_func()
测试:
>>> import my_module
>>> my_module.test()
hello
>>> def goodbye():
... print 'goodbye'
>>> my_module._func = goodbye
>>> my_module.test()
goodbye