# Inheritable script Docstrings in Project Library not populating intellisense popup

**URL:** <https://forum.inductiveautomation.com/t/inheritable-script-docstrings-in-project-library-not-populating-intellisense-popup/114605>\
**Category:** Ignition\
**Tags:** scripting, ignition81\
**Created:** [March 20, 2026, 7:59pm UTC](https://forum.inductiveautomation.com/t/inheritable-script-docstrings-in-project-library-not-populating-intellisense-popup/114605 "2026-03-20T19:59:18Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Philip\_Knowlton](https://avatars.discourse-cdn.com/v4/letter/p/e495f1/32.png) [@Philip\_Knowlton](https://forum.inductiveautomation.com/u/Philip_Knowlton)\
**Post date:** [March 20, 2026, 7:59pm UTC](https://forum.inductiveautomation.com/t/inheritable-script-docstrings-in-project-library-not-populating-intellisense-popup/114605/1 "2026-03-20T19:59:18Z")

</div>

Hello all,

I’m having an issue with my Python Docstrings where they’re not populating the Intellisense popup when I go to call them. Other Global scripts DO popup properly, just not this new one.

I’ve already restarted the gateway, no change.

I’ve compared the formatting against Google’s Python Style Guide AND against the other Global scripts that operate correctly.

I can call the script and it operates correctly, just no info popup.

Hoping someone like @pturmel can help with the Java wizardry 🙂.

```python
"""
These are all functions for helping with tag read/write functions, starting with tag read/write quality checks.
"""

#---------------------------------------------------------------------------------------------------------------#
# TAG READ/WRITE QUALITY CHECKS BEGIN
#---------------------------------------------------------------------------------------------------------------#

def _all_write_good(results, log):
	"""
	Returns True if all write results report good quality; accepts a single result or a list.
	
	Args:
		results: A single string or iterable list of tag write results.
		log: Gateway logger object initialized by system.util.getLogger(name).
	
	Returns:
		True/False, depending on if all write results are good quality.
		
	Raises:
		Exception: in case of exceptions, reports to gateway logs & returns False.
	"""
	try:
		if results is None:
			return False
		
		### This is for normalizing the results into an iterable, regardless of if they are a single item or multiple.
		# Only list-like objects have the __iter__ attribute (iterable)
		# Therefor, if results are iterable AND If results are not string or unicode:
		if hasattr(results, ' __iter__') and not isinstance(results, (str, unicode)):
			iterable = results
		else:
			iterable = [results]
		
		# results have been normalized to a list, evaluate each item.
		for i in iterable:
			if hasattr(i, 'isGood'):
				if not i.isGood():
					return False
			
			# Fallback to string compare (brittle, but better than nothing)
			else:
				if unicode(i) != u'Good':
					return False
		# Assuming none of the fallout conditions have been satisfied, return True
		return True
	except Exception as exc:
		log.error('_all_write_good() returned an exception: {}'.format(exc))
		return False
		
#---------------------------------------------------------------------------------------------------------------#
def _all_read_good(qualified_values, log):
	"""
	Used with system.tag.readBlocking(); Returns True if all read results have .quality.isGood() == True.
	
	Args:
		qualified_values: A single object or list of objects returned by system.tag.readBlocking().
		log: Gateway logger object initialized by system.util.getLogger(name).
		
	Returns:
		True/False, depending on if all read results are good quality.
		
	Raises:
		Exception: in case of exceptions, reports to gateway logs & returns False.
	"""
	try:
		for qv in qualified_values:
			if not hasattr(qv, 'quality') or not qv.quality.isGood():
				return False
		return True
	except Exception as exc:
		log.error('_all_read_good() returned an exception: {}'.format(exc))
		return False
#---------------------------------------------------------------------------------------------------------------#
# TAG WRITE FUNCTION
#---------------------------------------------------------------------------------------------------------------#
def _write_with_retry(paths, values, timeout_ms, retries, log):
	"""
	Write with a limited number of retries.
	
	Args:
		paths: single string ('[default]PKnowlton_Testing/Integer1') or list [].
		values: single value or list [], must match paths.
		timeout_ms: timeout in milleseconds.
		log: Gateway logger object initiated by system.util.getLogger(name)
		
	Returns:
		2 items: True/False, and the last write results.
		
	Raises:
		Exception: in case of exceptions, reports to gateway logs & reports false.
	"""
	attempts = 0
	last_results = None
	while attempts <= retries:
		last_results = system.tag.writeBlocking(paths, values, timeout_ms)
		if _all_write_good(last_results, log):
			return True, last_results
		attempts += 1
		if attempts <= retries:
			log.warn("Write quality not good; retrying {}/{}... Results: {}".format(attempts, retries, last_results))
	return False, last_results

```

 ![java_eZdiqvGjDi](https://us1.discourse-cdn.com/inductiveautomation/original/3X/1/6/16d4ee9b019e7227b75a5ed5e4135fbc7ce98a27.jpeg)

 ![java_VhRvneMxzP](https://us1.discourse-cdn.com/inductiveautomation/original/3X/e/3/e3c935f2f4ec9c16be27293838a4df1d580175ec.jpeg)

Both of these scripts are inherited and have their Docstring formatting the same. Just in case someone asks, yes I’ve saved & restarted the project/gateway.

Ignition 8.1.47, running on Windows Server 2019 | amd64

Java version 17.0.13+11-LTS

58gb/119gb

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [March 20, 2026, 8:11pm UTC](https://forum.inductiveautomation.com/t/inheritable-script-docstrings-in-project-library-not-populating-intellisense-popup/114605/2 "2026-03-20T20:11:39Z")

</div>

Sorry, no clue.

---

<div class="post-metadata">

**Author:** ![Philip\_Knowlton](https://avatars.discourse-cdn.com/v4/letter/p/e495f1/32.png) [@Philip\_Knowlton](https://forum.inductiveautomation.com/u/Philip_Knowlton)\
**Post date:** [March 20, 2026, 8:16pm UTC](https://forum.inductiveautomation.com/t/inheritable-script-docstrings-in-project-library-not-populating-intellisense-popup/114605/3 "2026-03-20T20:16:39Z")

</div>

Well that sucks.

---

<div class="post-metadata">

**Author:** ![MMaynard](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/mmaynard/32/3366_2.png) [@MMaynard](https://forum.inductiveautomation.com/u/MMaynard)\
**Post date:** [March 20, 2026, 8:20pm UTC](https://forum.inductiveautomation.com/t/inheritable-script-docstrings-in-project-library-not-populating-intellisense-popup/114605/4 "2026-03-20T20:20:39Z")

</div>

Only difference I see is the ones that don’t work start with \_ while barCodeScan doesn’t?

---

<div class="post-metadata">

**Author:** ![Philip\_Knowlton](https://avatars.discourse-cdn.com/v4/letter/p/e495f1/32.png) [@Philip\_Knowlton](https://forum.inductiveautomation.com/u/Philip_Knowlton)\
**Post date:** [March 20, 2026, 8:21pm UTC](https://forum.inductiveautomation.com/t/inheritable-script-docstrings-in-project-library-not-populating-intellisense-popup/114605/5 "2026-03-20T20:21:27Z")

</div>

Yeah I thought that too, so I tried re-naming the functional one to include the underscore. It still worked, the other one still didn’t.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [March 20, 2026, 8:22pm UTC](https://forum.inductiveautomation.com/t/inheritable-script-docstrings-in-project-library-not-populating-intellisense-popup/114605/6 "2026-03-20T20:22:15Z")

</div>

It's the underscore.

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/4/d/4dae577dfbfdab4e32efaed2c01a74bcc39680a2.png)

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/f/e/fe646829afd881ee8b832e0280f17c59d4e0de57.png)

---

<div class="post-metadata">

**Author:** ![Philip\_Knowlton](https://avatars.discourse-cdn.com/v4/letter/p/e495f1/32.png) [@Philip\_Knowlton](https://forum.inductiveautomation.com/u/Philip_Knowlton)\
**Post date:** [March 20, 2026, 8:24pm UTC](https://forum.inductiveautomation.com/t/inheritable-script-docstrings-in-project-library-not-populating-intellisense-popup/114605/7 "2026-03-20T20:24:44Z")

</div>

@paul-griffith do I need to rename the functions in the script as well, or just the overall script?

Also, I primarily added the underscore since I’m using something so close to ‘tag’ that I didn’t want to unintentionally cause issues/conflicts. Do you see any reason to not name it ‘tags’?

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [March 20, 2026, 8:27pm UTC](https://forum.inductiveautomation.com/t/inheritable-script-docstrings-in-project-library-not-populating-intellisense-popup/114605/8 "2026-03-20T20:27:08Z")

</div>

The actual function names.

The logic is that leading underscores 'by convention' mean something that should only be usable within the same script, so no point hinting them in other contexts even if they're technically callable.

The system will prevent you from naming your project library anything with conflicts that'll cause you issues with imports; beyond that I'd avoid anything like `list` or `str` or other builtin functions.

---

<div class="post-metadata">

**Author:** ![Philip\_Knowlton](https://avatars.discourse-cdn.com/v4/letter/p/e495f1/32.png) [@Philip\_Knowlton](https://forum.inductiveautomation.com/u/Philip_Knowlton)\
**Post date:** [March 20, 2026, 8:37pm UTC](https://forum.inductiveautomation.com/t/inheritable-script-docstrings-in-project-library-not-populating-intellisense-popup/114605/9 "2026-03-20T20:37:15Z")

</div>

Thanks @paul-griffith !

I had to delete the script entirely and add it back in before it would re-parse correctly, but now it’s populating! I love this community so much, you guys are rockstars.

 ![java_BbIo8ESRUZ](https://us1.discourse-cdn.com/inductiveautomation/original/3X/9/b/9b0d6dddea8a2b8d7c07a87b3931e55b549f6821.jpeg)
