आर्ग

समस्या की शिकायत करें सोर्स देखें

ऐसा ऑब्जेक्ट जो मेमोरी को बेहतर तरीके से इकट्ठा करता है, यानी कि कमांड लाइन बनाने के लिए ज़रूरी डेटा.

ऐसा अक्सर होता है कि किसी कार्रवाई के लिए, एक बड़ी कमांड लाइन की ज़रूरत होती है, जिसमें ट्रांज़िटिव डिपेंडेंसी से वैल्यू इकट्ठा होती हैं. उदाहरण के लिए, कोई लिंकर कमांड लाइन लिंक की जा रही सभी लाइब्रेरी के लिए ज़रूरी हर ऑब्जेक्ट फ़ाइल की सूची बना सकती है. ऐसे सार्वजनिक परिवहन डेटा को depset में सेव करना सबसे सही तरीका है, ताकि इन्हें एक से ज़्यादा टारगेट के साथ शेयर किया जा सके. हालांकि, अगर नियम के लेखक को ये निर्देश स्ट्रिंग की सूचियों में बदलने होंगे, तो ऐक्शन कमांड लाइन बन जाएगी. इससे, शेयर करने की मेमोरी को ऑप्टिमाइज़ करने की सुविधा बंद हो जाएगी.

इसी वजह से, ऐक्शन बनाने वाले फ़ंक्शन स्ट्रिंग के साथ-साथ Args ऑब्जेक्ट स्वीकार करते हैं. हर Args ऑब्जेक्ट, स्ट्रिंग और डेप्सेट को एक साथ दिखाता है. इसमें डेटा में बदलाव करने के लिए, वैकल्पिक बदलाव भी किए जाते हैं. Args ऑब्जेक्ट, डिपेशन को प्रोसेस नहीं करते. ये कमांड, एक्ज़ीक्यूशन फ़ेज़ तक होते हैं, जब कमांड लाइन का हिसाब लगाने का समय आता है. इसकी मदद से, विश्लेषण के पूरा होने के बाद ही किसी भी महंगी कॉपी को अलग किया जा सकता है. ज़्यादा जानकारी के लिए, परफ़ॉर्मेंस को ऑप्टिमाइज़ करना पेज देखें.

Args को कॉल करने के लिए, ctx.actions.args() को कॉल करें. उन्हें ctx.actions.run() या ctx.actions.run_shell() के arguments पैरामीटर के तौर पर पास किया जा सकता है. Args ऑब्जेक्ट के हर म्यूटेशन में, आखिर की कमांड लाइन में वैल्यू जुड़ जाती हैं.

map_each की सुविधा की मदद से, आइटम को स्ट्रिंग में बदलने का तरीका पसंद के मुताबिक बनाया जा सकता है. अगर आप map_each फ़ंक्शन नहीं देते हैं, तो स्टैंडर्ड कन्वर्ज़न कुछ ऐसा होगा:

  • जो वैल्यू पहले से ही स्ट्रिंग के तौर पर मौजूद हैं उन्हें वैसे ही छोड़ दिया जाएगा.
  • File ऑब्जेक्ट, उनकी File.path वैल्यू में बदल जाते हैं.
  • अन्य सभी टाइप को बिना तय किए गए तरीके से स्ट्रिंग में बदला जाता है. इसलिए, File या add() टाइप के वैल्यू को add() पर पास न करें. अगर add_all() या add_joined() को पास किया जाता है, तो आपको map_each फ़ंक्शन देना चाहिए.

स्ट्रिंग फ़ॉर्मैटिंग (format, format_each, और add*() तरीकों के format_joined पैरामीटर) का इस्तेमाल करते समय, फ़ॉर्मैट टेंप्लेट को उसी तरह लागू किया जाता है जिस तरह स्ट्रिंग पर % को बदला जाता है. हालांकि, टेंप्लेट में सिर्फ़ एक विकल्प प्लेसहोल्डर होना चाहिए और उसे %s होना चाहिए. लिटरल प्रतिशत को %% से कम छोड़ा जा सकता है. वैल्यू को ऊपर दी गई स्ट्रिंग के हिसाब से बदलने के बाद, फ़ॉर्मैटिंग लागू की जाती है.

हर add*() तरीके में एक वैकल्पिक फ़ॉर्म होता है जो एक और पोज़िशनल पैरामीटर स्वीकार करता है. साथ ही, बाकी आर्ग्युमेंट से पहले "आर्ग्युमेंट का नाम" स्ट्रिंग शामिल करना होता है. add_all और add_joined के लिए, अतिरिक्त स्ट्रिंग नहीं जोड़ी जाएगी. ऐसा तब होगा, जब क्रम खाली हो. उदाहरण के लिए, एक ही इस्तेमाल के लिए कमांड लाइन में --foo val1 val2 val3 --bar या सिर्फ़ --bar जोड़े जा सकते हैं. यह इस बात पर निर्भर करता है कि दिए गए क्रम में val1..val3 है या खाली है.

अगर कमांड लाइन का साइज़, सिस्टम के तय साइज़ से ज़्यादा हो सकता है, तो पैरामीटर की फ़ाइल में आर्ग्युमेंट का इस्तेमाल किया जा सकता है. use_param_file() और set_param_file_format() देखें.

उदाहरण: मान लीजिए कि हम कमांड लाइन जनरेट करना चाहते हैं:

--foo foo1.txt foo2.txt ... fooN.txt --bar bar1.txt,bar2.txt,...,barM.txt --baz
हम इस Args ऑब्जेक्ट का इस्तेमाल कर सकते हैं:
# foo_deps and bar_deps are depsets containing
# File objects for the foo and bar .txt files.
args = ctx.actions.args()
args.add_all("--foo", foo_deps)
args.add_joined("--bar", bar_deps, join_with=",")
args.add("--baz")
ctx.actions.run(
  ...
  arguments = [args],
  ...
)

पैसे चुकाकर बने सदस्य

जोड़ें

Args Args.add(arg_name_or_value, value=unbound, *, format=None)

इस कमांड लाइन में आर्ग्युमेंट जोड़ता है.

पैरामीटर

पैरामीटर जानकारी
arg_name_or_value ज़रूरी है
अगर दो पोज़िशनल पैरामीटर पास किए जाते हैं, तो उन्हें आर्ग्युमेंट के नाम से जाना जाता है. आर्ग्युमेंट का नाम, बिना किसी प्रोसेसिंग के वैल्यू से पहले जोड़ दिया जाता है. अगर सिर्फ़ एक पोज़िशनल पैरामीटर पास होता है, तो उसे value के तौर पर देखा जाता है (नीचे देखें).
value डिफ़ॉल्ट = अनबाउंड
जोड़ने के लिए ऑब्जेक्ट. यह ऊपर बताए गए स्टैंडर्ड कन्वर्ज़न का इस्तेमाल करके, स्ट्रिंग में बदल जाएगा. इस फ़ंक्शन के लिए कोई map_each पैरामीटर नहीं है. इसलिए, value एक स्ट्रिंग या File होनी चाहिए. इस सूची के बजाय, add_all() या add_joined() को सूची, टपल, डिसेट या डायरेक्ट्री पास करना ज़रूरी है.
format string; or None: डिफ़ॉल्ट = कोई नहीं
value के स्ट्रिंग वाले वर्शन पर लागू किया जाने वाला फ़ॉर्मैट स्ट्रिंग पैटर्न.

सभी_जोड़ें

Args Args.add_all(arg_name_or_values, values=unbound, *, map_each=None, format_each=None, before_each=None, omit_if_empty=True, uniquify=False, expand_directories=True, terminate_with=None, allow_closure=False)

इस कमांड लाइन में कई आर्ग्युमेंट जोड़ता है. एक्ज़ीक्यूशन फ़ेज़ के दौरान, आइटम को लेज़ी तरीके से प्रोसेस किया जाता है.

ज़्यादातर प्रोसेसिंग, जोड़े जाने वाले आर्ग्युमेंट की सूची पर होती है. इसके लिए, यह तरीका अपनाया जाता है:

  1. हर डायरेक्ट्री में File आइटम को, उस डायरेक्ट्री में मौजूद बार-बार इस्तेमाल होने वाले सभी File से बदल दिया जाता है.
  2. अगर map_each दिया जाता है, तो यह हर आइटम पर लागू होता है. साथ ही, इससे आर्ग्युमेंट की सूची बनाने के लिए, स्ट्रिंग की सूची जोड़ी जाती है. ऐसा न होने पर, शुरुआती आर्ग्युमेंट सूची ही हर सामान पर स्टैंडर्ड कन्वर्ज़न लागू करने का नतीजा होती है.
  3. अगर सूची में मौजूद कोई आर्ग्युमेंट मौजूद है, तो उसे format_each के साथ फ़ॉर्मैट किया जाता है.
  4. uniquify सही होने पर, डुप्लीकेट तर्क हटा दिए जाते हैं. पहला मामला वही है जो बचा रहता है.
  5. before_each स्ट्रिंग देने पर, उसे सूची में मौजूद हर आर्ग्युमेंट के पहले नए आर्ग्युमेंट के तौर पर डाला जाता है. इससे, इस पॉइंट से जोड़े जाने वाले आर्ग्युमेंट की संख्या दोगुनी हो जाती है.
  6. अगर सूची खाली है और omit_if_empty सही है, तो इस मामले को छोड़कर, अगर तर्क के नाम और terminate_with दिए गए हैं, तो उन्हें पहले और आखिरी आर्ग्युमेंट के तौर पर डाला जाता है.
ध्यान दें कि खाली स्ट्रिंग, मान्य आर्ग्युमेंट हैं. ये प्रोसेस के सभी चरणों पर निर्भर होती हैं.

पैरामीटर

पैरामीटर जानकारी
arg_name_or_values ज़रूरी है
अगर दो पोज़िशनल पैरामीटर पास किए जाते हैं, तो उन्हें आर्ग्युमेंट के नाम से जाना जाता है. आर्ग्युमेंट का नाम values से पहले, बिना किसी प्रोसेसिंग के एक अलग आर्ग्युमेंट के तौर पर जोड़ा जाता है. अगर omit_if_empty सही है (डिफ़ॉल्ट) और कोई दूसरा आइटम जोड़ा नहीं गया है, तो यह आर्ग्युमेंट नाम नहीं जोड़ा जाएगा. जैसे कि values खाली है या इसके सभी आइटम फ़िल्टर किए गए हैं. अगर सिर्फ़ एक पोज़िशनल पैरामीटर पास होता है, तो उसे values के तौर पर देखा जाता है (नीचे देखें).
values sequence; or depset: डिफ़ॉल्ट = अनबाउंड
वह सूची, ट्यूल या डेपसेट जिसके आइटम जोड़े जाएंगे.
map_each callable; or None: डिफ़ॉल्ट = कोई नहीं
एक ऐसा फ़ंक्शन है जो हर आइटम को शून्य या उससे ज़्यादा स्ट्रिंग में बदलता है. इसे जोड़ने से पहले प्रोसेस किया जा सकता है. अगर यह पैरामीटर नहीं दिया गया है, तो स्टैंडर्ड कन्वर्ज़न का इस्तेमाल किया जाता है.

फ़ंक्शन को एक या दो पोज़िशनल आर्ग्युमेंट दिए जाते हैं: बदला जाने वाला आइटम और उसके बाद वैकल्पिक DirectoryExpander. दूसरा आर्ग्युमेंट सिर्फ़ तब पास होगा, जब दिया गया फ़ंक्शन उपयोगकर्ता की ओर से तय किया गया हो (बिल्ट-इन न हो) और एक से ज़्यादा पैरामीटर की जानकारी दे.

सामान लौटाने की वैल्यू का टाइप, इस बात पर निर्भर करता है कि सामान के लिए कितने आर्ग्युमेंट बनाए जाने हैं:

  • आम तौर पर, जब हर आइटम एक स्ट्रिंग में बदल जाता है, तो फ़ंक्शन को उस स्ट्रिंग को दिखाना चाहिए.
  • अगर किसी आइटम को पूरी तरह से फ़िल्टर कर दिया गया है, तो फ़ंक्शन के जवाब में None दिखना चाहिए.
  • अगर आइटम एक से ज़्यादा स्ट्रिंग में बदल जाता है, तो फ़ंक्शन उन स्ट्रिंग की सूची दिखाता है.
किसी स्ट्रिंग या None को दिखाने का असर, 1 वर्णों की लंबाई या 0 वाली सूची को रिटर्न करने के जैसा ही होता है. हालांकि, बेहतर और आसानी से पढ़ने लायक सूची बनाने से बचा जा सकता है, जहां यह ज़रूरी नहीं है.

आम तौर पर, expand_directories=True के सेट होने पर, डायरेक्ट्री में मौजूद आइटम अपने-आप उनके कॉन्टेंट में दिखने लगते हैं. हालांकि, यह अन्य वैल्यू में मौजूद डायरेक्ट्री को बड़ा नहीं करेगा. उदाहरण के लिए, जब आइटम ऐसे स्ट्रक्चर हों जिनमें डायरेक्ट्री के तौर पर फ़ील्ड मौजूद हों. इस स्थिति में, दी गई डायरेक्ट्री की फ़ाइलें मैन्युअल तरीके से पाने के लिए, DirectoryExpander आर्ग्युमेंट को लागू किया जा सकता है.

एक्ज़ीक्यूशन के फ़ेज़ में बड़े ऐनलिसिस के चरण वाले डेटा के स्ट्रक्चर को बनाए रखने के लिए, map_each फ़ंक्शन को टॉप लेवल def का एलान करना चाहिए. हो सकता है कि यह नेस्ट किए गए फ़ंक्शन के तौर पर, डिफ़ॉल्ट रूप से बंद न हो.

चेतावनी: print() कॉल के दौरान, map_each पर किए गए स्टेटमेंट से कोई भी आउटपुट नहीं दिखेगा.

format_each string; or None: डिफ़ॉल्ट = कोई नहीं
एक वैकल्पिक फ़ॉर्मैट स्ट्रिंग पैटर्न, जिसे map_each फ़ंक्शन से मिलने वाली हर स्ट्रिंग पर लागू किया जाता है. फ़ॉर्मैट स्ट्रिंग में सिर्फ़ एक '%s' प्लेसहोल्डर होना चाहिए.
before_each string; or None: डिफ़ॉल्ट = कोई नहीं
values से मिले हर तर्क को जोड़ने से पहले जोड़ने के लिए एक वैकल्पिक आर्ग्युमेंट जोड़ा जाता है.
omit_if_empty डिफ़ॉल्ट = सही
अगर सही है, तो जोड़ने के लिए values से कोई आर्ग्युमेंट नहीं मिलता है, तो बाकी सभी प्रोसेसिंग को बंद कर दिया जाता है और कमांड लाइन में कोई बदलाव नहीं होगा. गलत होने पर, अगर आर्ग्युमेंट का नाम और terminate_with दिया गया है, तब भी उसे जोड़ा जाएगा, भले ही अन्य आर्ग्युमेंट मौजूद हों या न हों.
uniquify डिफ़ॉल्ट = गलत
अगर सही है, तो values से मिले डुप्लीकेट आर्ग्युमेंट हटा दिए जाएंगे. हर आर्ग्युमेंट का सिर्फ़ पहली बार होने का मौका ही बचेगा. आम तौर पर, इस सुविधा की ज़रूरत नहीं होती, क्योंकि डेप्सेट पहले से ही डुप्लीकेट को छोड़ देता है. हालांकि, अगर map_each एक से ज़्यादा आइटम के लिए एक ही स्ट्रिंग बनता है, तो इससे मदद मिल सकती है.
expand_directories डिफ़ॉल्ट = सही
अगर सही है, तो values में मौजूद सभी डायरेक्ट्री को फ़ाइलों की एक फ़्लैट सूची में शामिल कर दिया जाएगा. ऐसा map_each के लागू होने से पहले होता है.
terminate_with string; or None: डिफ़ॉल्ट = कोई नहीं
दूसरे सभी तर्कों के बाद जोड़ने के लिए वैकल्पिक आर्ग्युमेंट. अगर omit_if_empty सही है (डिफ़ॉल्ट) और कोई दूसरा आइटम जोड़ा नहीं जाता, तो यह तर्क नहीं जोड़ा जाएगा. जैसे, values खाली है या इसके सभी आइटम फ़िल्टर किए गए हैं.
allow_closure डिफ़ॉल्ट = गलत
अगर सही है, तो map_each जैसे फ़ंक्शन पैरामीटर में बंद करने की अनुमति देता है. आम तौर पर, ऐसा करना ज़रूरी नहीं है. इससे, फ़ेज़ के फ़ेज़ के स्ट्रक्चर को बनाए रखने में कोई जोखिम नहीं होता.

add_joined

Args Args.add_joined(arg_name_or_values, values=unbound, *, join_with, map_each=None, format_each=None, format_joined=None, omit_if_empty=True, uniquify=False, expand_directories=True, allow_closure=False)

सेपरेटर का इस्तेमाल करके, एक से ज़्यादा वैल्यू को जोड़कर इस कमांड लाइन में आर्ग्युमेंट जोड़ता है. एक्ज़ीक्यूशन फ़ेज़ के दौरान, आइटम को लेज़ी तरीके से प्रोसेस किया जाता है.

प्रोसेस करना add_all() से मिलता-जुलता है. हालांकि, values से मिले आर्ग्युमेंट की सूची को एक आर्ग्युमेंट में जोड़ा जाता है, जिसे join_with.join(...) के हिसाब से जोड़ा जाता है. इसके बाद, दिए गए format_joined स्ट्रिंग टेंप्लेट का इस्तेमाल करके, फ़ॉर्मैटिंग की जाती है. add_all() के उलट, कोई before_each या terminate_with पैरामीटर नहीं होता, क्योंकि आइटम को किसी एक आर्ग्युमेंट में जोड़ने पर, आम तौर पर इनका इस्तेमाल नहीं होता.

अगर फ़िल्टर करने के बाद, आर्ग्युमेंट में शामिल होने के लिए कोई स्ट्रिंग नहीं है और omit_if_empty सही है (डिफ़ॉल्ट), तो कोई प्रोसेस नहीं होती. अगर शामिल होने के लिए कोई स्ट्रिंग नहीं है, तो omit_if_empty स्ट्रिंग जॉइन नहीं होगी.

पैरामीटर

पैरामीटर जानकारी
arg_name_or_values ज़रूरी है
अगर दो पोज़िशनल पैरामीटर पास किए जाते हैं, तो उन्हें आर्ग्युमेंट के नाम से जाना जाता है. आर्ग्युमेंट का नाम values से पहले, बिना किसी प्रोसेसिंग के जोड़ दिया जाता है. अगर omit_if_empty सही है (डिफ़ॉल्ट) है या एक साथ जोड़ने के लिए values से कोई स्ट्रिंग नहीं मिलती है, तो यह आर्ग्युमेंट नहीं जोड़ा जाएगा. ऐसा तब हो सकता है, जब values खाली हो या उसके सभी आइटम फ़िल्टर किए गए हों. अगर सिर्फ़ एक पोज़िशनल पैरामीटर पास होता है, तो उसे values के तौर पर देखा जाता है (नीचे देखें).
values sequence; or depset: डिफ़ॉल्ट = अनबाउंड
वह सूची, ट्यूल या डेपसेट जिसके आइटम को जोड़ा जाएगा.
join_with ज़रूरी है
डीलिमिटर स्ट्रिंग, जो string.join() की तरह ही map_each और format_each को लागू करने पर मिलने वाली स्ट्रिंग में शामिल होने के लिए इस्तेमाल की जाती है.
map_each callable; or None: डिफ़ॉल्ट = कोई नहीं
add_all के लिए समान.
format_each string; or None: डिफ़ॉल्ट = कोई नहीं
add_all के लिए समान.
format_joined string; or None: डिफ़ॉल्ट = कोई नहीं
जॉइन की गई स्ट्रिंग पर एक वैकल्पिक फ़ॉर्मैट स्ट्रिंग पैटर्न लागू किया गया. फ़ॉर्मैट स्ट्रिंग में सिर्फ़ एक '%s' प्लेसहोल्डर होना चाहिए.
omit_if_empty डिफ़ॉल्ट = सही
अगर सही है, तो एक साथ जोड़ने के लिए कोई स्ट्रिंग नहीं होती है (ऐसा इसलिए हो सकता है, क्योंकि values खाली होता है या इसके सभी आइटम फ़िल्टर किए जाते हैं), फिर आगे की प्रोसेस को बंद कर दिया जाता है और कमांड लाइन में कोई बदलाव नहीं होगा. गलत होने पर, अगर एक साथ जोड़ने के लिए कोई स्ट्रिंग नहीं होती है, तो दो तर्क जोड़े जाएंगे: आर्ग्युमेंट का नाम के बाद खाली स्ट्रिंग होगी (जो शून्य स्ट्रिंग का लॉजिकल जॉइन है).
uniquify डिफ़ॉल्ट = गलत
add_all के लिए समान.
expand_directories डिफ़ॉल्ट = सही
add_all के बराबर.
allow_closure डिफ़ॉल्ट = गलत
add_all के लिए समान.

set_param_file_format

Args Args.set_param_file_format(format)

पैरामीटर फ़ाइल का फ़ॉर्मैट सेट करता है, अगर कोई फ़ाइल इस्तेमाल की जाती है

पैरामीटर

पैरामीटर जानकारी
format ज़रूरी है
इनमें से कोई एक होना चाहिए:
  • "मल्टीलाइन": हर आइटम (तर्क/नाम) पैरामीटर फ़ाइल में मौजूद शब्दों के बाद लिखा जाता है, जिसके बाद एक नया लाइन वर्ण मौजूद होता है.
  • "शेल": "मल्टीलाइन" की तरह ही, लेकिन आइटम शेल से कोट किए हुए होते हैं
  • "flag_per_line": "मल्टीलाइन" की तरह ही (1) पैरामीटर फ़ाइल में सिर्फ़ फ़्लैग ('--' से शुरू होने वाले) और (2) फ़्लैग के वैल्यू, अगर कोई है, उन्हें '=' सेपरेटर के साथ उसी लाइन में लिखा जाता है. फ़ॉर्मैट ऐसा होना चाहिए जो ऐब्साइल फ़्लैग की लाइब्रेरी से मिला है.

कॉल न करने पर, फ़ॉर्मैट डिफ़ॉल्ट तौर पर "शेल" पर सेट हो जाता है.

Use_param_file

Args Args.use_param_file(param_file_arg, *, use_always=False)

पैरामीटर की वैल्यू को पैरामीटर फ़ाइल में बदल देता है. साथ ही, पैरामीटर को पैरामीटर फ़ाइल में बदल देता है. इसका इस्तेमाल तब करें, जब सिस्टम की आर्ग्युमेंट की सीमाओं के लिए आपके आर्ग्युमेंट बहुत बड़े हों.

बाद में, परफ़ॉर्मेंस के दौरान पैरामीटर से मिलने वाली वैल्यू को पैरामीटर ट्री में शामिल नहीं किया जा सकता. अगर आप डीबग करने की कार्रवाइयां हैं और पैरामीटर फ़ाइल की जांच करना चाहते हैं, तो अपने बिल्ड में --materialize_param_files पास करें.

पैरामीटर

पैरामीटर जानकारी
param_file_arg ज़रूरी है
एक फ़ॉर्मैट स्ट्रिंग जिसमें एक ही "%s" का इस्तेमाल होता हो. अगर किसी पैरामीटर फ़ाइल में आर्ग्युमेंट को बढ़ाया गया है, तो उन्हें पैरामीटर की फ़ाइल के पाथ के साथ फ़ॉर्मैट किए गए आर्ग्युमेंट से बदल दिया जाता है.

उदाहरण के लिए, अगर आर्ग्युमेंट "params.txt" की किसी पैरामीटर फ़ाइल में फैले हुए हैं, तो "--file=%s" की जानकारी देने से कार्रवाई कमांड लाइन में "--file=params.txt" शामिल हो जाएगा.

use_always डिफ़ॉल्ट = False
क्या पैरामीटर को हमेशा किसी पैरामीटर फ़ाइल में बांटना है या नहीं. अगर गलत है, तो बेज़ल यह तय करेगा कि आपके सिस्टम और आर्ग्युमेंट की लंबाई के आधार पर आर्ग्युमेंट को स्प्लिट करना है या नहीं.