【发布时间】:2016-01-12 12:30:28
【问题描述】:
为了提高我的Python技能,我尝试阅读和理解Google API Python client的源代码。
但是我被困住了,尽管谷歌搜索,我无法理解代码的特定部分的工作。
我做了一个小程序来演示这部分:
upload.py
from __future__ import print_function
import os
import httplib2
import apiclient
import oauth2client
try:
import argparse
flags = argparse.ArgumentParser(
parents=[oauth2client.tools.argparser]).parse_args()
except ImportError:
flags = None
SCOPES = 'https://www.googleapis.com/auth/drive'
CLIENT_SECRET_FILE = 'client_secret.json'
# Enter your project name here!!
APPLICATION_NAME = 'API Project'
def get_credentials():
"""Gets valid user credentials from storage.
If nothing has been stored, or if the stored credentials are invalid,
the OAuth2 flow is completed to obtain the new credentials.
Returns:
Credentials, the obtained credential.
"""
home_dir = os.path.expanduser('~')
credential_dir = os.path.join(home_dir, '.credentials')
if not os.path.exists(credential_dir):
os.makedirs(credential_dir)
credential_path = os.path.join(credential_dir,
'drive-credentials.json')
store = oauth2client.file.Storage(credential_path)
credentials = store.get()
if not credentials or credentials.invalid:
flow = oauth2client.client.flow_from_clientsecrets(
CLIENT_SECRET_FILE, SCOPES)
flow.user_agent = APPLICATION_NAME
if flags:
credentials = oauth2client.tools.run_flow(flow, store, flags)
else: # Needed only for compatibility with Python 2.6
credentials = oauth2client.tools.run(flow, store)
print('Storing credentials to ' + credential_path)
return credentials
def main():
credentials = get_credentials()
http = credentials.authorize(httplib2.Http())
file_service = apiclient.discovery.build('drive', 'v3', http=http).files()
results = file_service.get(
fileId="0Bw239KLrN7zoWl95Nml2ZUpsNnc").execute()
print(results)
results = file_service.list(
pageSize=10, fields="files(id, name)").execute()
print(results)
if __name__ == '__main__':
main()
在file_service = apiclient.discovery.build('drive', 'v3', http=http).files() 行中,我无法在库源代码的任何地方找到files() 方法的定义。我也找不到任何名为get() 或list() 的方法。
我在Github repository 和code documentation 上阅读了该库的源代码,但没有找到任何有用的东西。
这是我迄今为止尝试过的:
通过查看文件discovery.py,函数build() 返回函数build_from_document() 的结果,该函数又返回类Resource() 的实例。
但是现在有一个死胡同,因为类Resource() 没有任何称为files() 的方法。
那么,如何找到files()、get()、list() 等这些方法的内部工作原理?
【问题讨论】:
-
但是
Resource类似乎有方法可以为自身动态添加方法。我会从那里开始。 -
@Jasper 我绝对不知道它是如何工作的(我是 Python 的初学者)。您能否更详细地解释一下从哪里开始?
-
github.com/google/google-api-python-client/blob/master/… 这是我猜的相关功能。添加诸如“
print attr_name, value”之类的内容和代码以打印堆栈跟踪 (docs.python.org/2/library/traceback.html)(或使用您喜欢的调试器)以查看谁在调用此函数以添加files()、get()等。
标签: python methods google-api google-drive-api google-api-python-client